首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java头池执行器如何处理中断的线程

java头池执行器如何处理中断的线程
EN

Stack Overflow用户
提问于 2012-04-06 08:44:15
回答 2查看 3.5K关注 0票数 10

我创建了一个包含10个固定线程的ThreadPool。有时,我需要中断线程池中长时间运行的线程,主要是因为它们在某些操作中阻塞,发生超时,我中断了线程。我捕获InterruptedException并将线程的状态也设置为中断。在这种情况下,我的问题是,ThreadPool是否会创建一个新线程并用新线程替换中断的线程?下面是由Thread执行的示例代码。问题是,当这个线程被中断时,线程池会用新线程替换这个线程吗?

代码语言:javascript
复制
 public ResponseMessage call(){
    Future<ResponseMessage> future = CacheManager.getInstance().asyncFetch();
    ResponseMessage response = null;
    try {
        response = future.get();
    }
    catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    } catch (ExecutionException ex) {
        //create a blank response
    }

    return response;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-06 09:06:07

您不应该中断您不“拥有”的线程,因为您不知道它们如何响应。因为您无法控制线程调度,所以您实际上不知道给定的线程在您中断它的瞬间是否正在执行特定的任务

如果您想要取消已提供executor服务的任务,请在其关联的Future上调用cancel(true)。当您的任务检测到中断请求时,它应该通过调用Thread.currentThread().interrupt()来保留中断状态。

如果这样做,则executor将干净利落地处理中断,因为它会中断线程本身,并知道中断发生时线程正在执行任务。

票数 7
EN

Stack Overflow用户

发布于 2016-06-01 11:25:14

从一步一步的调试来看,我认为中断的线程将继续从工作队列getTask。在getTask之前已清除中断状态。

例如,如果将FixedThreadPool与LinkedBlockingQueue配合使用,则queue.take()内部的中断状态将由ReentrantLock.lockInterruptibly()清除

代码语言:javascript
复制
public final void acquireInterruptibly(int arg) throws InterruptedException {
    if (**Thread.interrupted()**)
        throw new InterruptedException();
    if (!tryAcquire(arg))
         doAcquireInterruptibly(arg);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10037918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档