如果我在主线程中执行ExecutorService.shutdownNow(),它不会停止所有线程但是如果我在Thread1或Thread2中执行ExecutorService.shutdownNow()它会杀死它的子子线程 如何将shutdown命令级联到最低级别?
Main thread
/ \
/ \
Thread 1 Thread 2
| | | | |
A B C D E
如何从主线程中杀死所有线程?
使用下面的代码片段来创建线程
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;
}
}
如何处理子线程中断?
答案 0 :(得分:1)
执行shutdownNow 列表shutdownNow() 基于Javadoc: 尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。 此方法不等待主动执行任务终止。使用awaitTermination来做到这一点。
除了尽力尝试停止处理主动执行任务之外,没有任何保证。 例如,典型的实现将通过Thread.interrupt()取消,因此任何无法响应中断的任务都可能永远不会终止。
答案 1 :(得分:0)
您可以使用ThreadPoolExecutor并传递ThreadFactory的实例。 ThreadFactory将使用与创建的每个新线程相关联的唯一ThreadGroup。如果您需要中断所有线程,那么您可以使用ThreadGroup中断方法,所有线程都将被中断。
public class GroupThreadFactory implements ThreadFactory {
private ThreadGroup group;
public GroupThreadFactory(ThreadGroup group) {
this.group = group;
}
public Thread newThread(Runnable r) {
return new Thread(group, r);
}
}