10

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

 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;
}
4

2 回答 2

7

您不应该中断您不“拥有”的线程,因为您不知道它们如何响应。由于您无法控制线程调度,因此您真的不知道给定线程在您中断它的那一刻正在执行特定任务

如果你想取消你已经给执行器服务的任务,调用cancel(true)它关联的Future. 当您的任务检测到中断请求时,它应该通过调用来保持中断状态Thread.currentThread().interrupt()

如果你这样做,执行器会干净地处理中断,因为它中断了线程本身,并且知道在中断发生时线程正在执行任务。

于 2012-04-06T01:06:07.187 回答
0

从一步一步的调试来看,我想被中断的线程会继续从工作队列中获取任务。在getTask之前已经清理了中断状态。

例如,如果您将 FixedThreadPool 与 LinkedBlockingQueue 一起使用,则中断状态queue.take()ReentrantLock.lockInterruptibly()

public final void acquireInterruptibly(int arg) throws InterruptedException {
    if (**Thread.interrupted()**)
        throw new InterruptedException();
    if (!tryAcquire(arg))
         doAcquireInterruptibly(arg);
}
于 2016-06-01T03:25:14.043 回答