我创建了一个ThreadPool包含10个固定线程的线程.有时我需要在线程池中断一个longrunning线程,主要是因为它们在某些操作中阻塞并且发生了超时并且我中断了线程.我抓住了InterruptedException并将Thread的状态设置为中断.在这种情况下,我的问题是,是否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;
}
Run Code Online (Sandbox Code Playgroud)
你不应该打断你没有"拥有"的线程,因为你不知道它们是如何响应的.由于您无法控制线程调度,因此您实际上不知道给定线程在您中断它的瞬间执行特定任务
如果要取消已经给予执行者服务的任务,请调用cancel(true)其关联的服务Future.当您的任务检测到中断请求时,它应通过调用保留中断状态Thread.currentThread().interrupt().
如果这样做,执行程序将干净地处理中断,因为它中断了线程本身,并且知道线程在中断发生时正在执行任务.