if (isDownloadLogRequired) {
ExecutorService pool = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
for (HostGenericServiceTicket hostGenericServiceTicket : hostGenericServiceTickets) {
pool.submit(new DiagnosticLogDownloader(logNames, downloadTo, hostGenericServiceTicket));
}
pool.shutdown();
try {
pool.awaitTermination(downloadTimeout, TimeUnit.SECONDS);
} catch (InterruptedException e) {
System.err.println(MessageFormat.format("{0}: Reason: {1}", e.getClass()
.getSimpleName(), e.getMessage()));
}
}
如果downloadTimeout设置为180秒,线程应该被杀死,程序应该结束吗?
答案 0 :(得分:4)
没有。超时是你想要等多少。线程池将在执行完所有任务后终止。
如果您调用shutdown()
,则线程池不会将新作业排入队列(但它不会停止正在运行的作业,并且将运行已经入队的作业)。
如果您致电shutdownNow()
,它将无法启动任何新作业,并会向工作线程发送中断。如果您的Runnable
正确检查中断并自动终止,则池将快速停止。否则,它等同于shutdown()
。
在Java中,没有办法强制终止线程(Thread.stop()
已被弃用,因为它的资源泄漏和容易出现死锁)。您只能要求线程终止(调用其interrupt()
方法),但由您的代码定期检查Thread.interrupted()
并正确使用InterruptedException
s。
礼貌工作者的一个例子是:
public class PoliteWorker implements Runnable {
private boolean successful = false;
public void run() {
while (...) {
if (Thread.interrupted()) {
myLogger.log(Level.INFO, "Thread was interrupted. Aborting...");
return;
}
...
try {
String line = myInput.readLine();
} catch (InterruptedIOException ex) {
//Must terminate
myLogger.log(Level.INFO, "Thread was interrupted. Aborting...", ex);
return;
} catch (IOException ex) {
//handle other exceptions
}
}
successful = true;
}
}