我创建了一个包含10个固定线程的ThreadPool。有时,我需要中断线程池中长时间运行的线程,主要是因为它们在某些操作中阻塞,发生超时,我中断了线程。我捕获InterruptedException并将线程的状态也设置为中断。在这种情况下,我的问题是,ThreadPool是否会创建一个新线程并用新线程替换中断的线程?下面是由Thread执行的示例代码。问题是,当这个线程被中断时,线程池会用新线程替换这个线程吗?
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;
}发布于 2012-04-06 09:06:07
您不应该中断您不“拥有”的线程,因为您不知道它们如何响应。因为您无法控制线程调度,所以您实际上不知道给定的线程在您中断它的瞬间是否正在执行特定的任务
如果您想要取消已提供executor服务的任务,请在其关联的Future上调用cancel(true)。当您的任务检测到中断请求时,它应该通过调用Thread.currentThread().interrupt()来保留中断状态。
如果这样做,则executor将干净利落地处理中断,因为它会中断线程本身,并知道中断发生时线程正在执行任务。
发布于 2016-06-01 11:25:14
从一步一步的调试来看,我认为中断的线程将继续从工作队列getTask。在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);
}https://stackoverflow.com/questions/10037918
复制相似问题