【发布时间】:2016-06-17 15:37:34
【问题描述】:
如果我在主线程中执行 ExecutorService.shutdownNow() 它不会停止所有线程但是如果我在 Thread1 或 Thread2 中执行 ExecutorService.shutdownNow() 它会杀死它的子子线程 如何将关机命令级联到最底层?
Main thread
/ \
/ \
Thread 1 Thread 2
| | | | |
A B C D E
如何从主线程杀死所有线程?
使用下面的sn-p创建线程
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(threadExecutor);
List<Future<Object>> futures = new ArrayList<Future<Object>>();
for(MultiThread mt : threadList)
{
futures.add(completionService.submit(mt));
}
while (futures.size() > 0) {
Future f = completionService.take();
futures.remove(f);
try {
Object result = f.get();
System.out.println(result);
} catch (Exception e) {
System.out.println("Caught exception from one task: " + e.getCause().getMessage() + ". shutdown now!");
threadExecutor.shutdownNow();
break;
}
}
如何处理子线程的中断?
【问题讨论】:
-
你有多少个
Executors?你都调用了实例方法shutdownNow()了吗? -
我有 2 个执行程序 ...1 在主线程中,另一个在创建线程 1 和线程 2 的子线程中。我在两个执行程序上都调用了 shutdownNow() 但我猜只有线程 1 和线程 2执行者 shutdownNow() 正在工作
-
根据我对多线程的经验,您必须遍历每个线程并将其设置为 null 或终止它,但是您现在正在执行此操作。我通常喜欢通过实现 Runnable 来创建我的线程。
-
只有配合才能停止线程。如果他们产生子线程,他们也必须照顾他们。
-
扩展 zapl 的观点:没有所谓的“停止线程”。
shutdownNow只是中断每个线程。每个 Runnable 和 Callable 的作者都可以通过干净退出来正确响应中断。
标签: java multithreading java.util.concurrent