我创建了一个ThreadPool
带有10个固定线程的线程。有时我需要中断线程池中一个正在运行的线程,主要是因为它们在某些操作中被阻塞并且发生超时,所以我中断了该线程。我赶上了InterruptedException
,并将线程的状态也设置为中断。在那种情况下,我的问题是,是否ThreadPool
创建一个新的线程并将被中断的线程替换为一个新的线程?以下是由线程执行的示例代码。问题是,当该线程被中断时,线程池是否用新线程替换了该线程?
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;
}
您不应该中断不属于您的线程,因为您不知道它们如何响应。由于您无法控制线程调度,因此您实际上不知道给定线程在中断特定任务时正在执行特定任务
如果您想取消已赋予执行者服务的任务,请调用cancel(true)
与之相关的Future
。当您的任务检测到中断请求时,应通过调用来保留中断状态Thread.currentThread().interrupt()
。
如果执行此操作,则执行程序将干净地处理该中断,因为它会中断线程本身,并且知道中断发生时该线程正在执行任务。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句