Java 如何停止树中的所有线程?

Java 如何停止树中的所有线程?,java,multithreading,java.util.concurrent,Java,Multithreading,Java.util.concurrent,如果我在主线程中执行ExecutorService.shutdownNow(),它不会停止所有线程,但如果我在Thread1或Thread2中执行ExecutorService.shutdownNow(),它会终止其子线程 如何将关机命令级联到最低级别 Main thread / \ / \ Thread 1 Thread 2 | | | | | A B C D E 如何从主线程杀

如果我在主线程中执行ExecutorService.shutdownNow(),它不会停止所有线程,但如果我在Thread1或Thread2中执行ExecutorService.shutdownNow(),它会终止其子线程 如何将关机命令级联到最低级别

       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;
                            }
                        }
CompletionService CompletionService=新的执行器CompletionService(threadExecutor);
列表期货=新的ArrayList();
for(多线程mt:threadList)
{
futures.add(completionService.submit(mt));
}
while(futures.size()>0){
Future f=completionService.take();
删除(f);
试一试{
对象结果=f.get();
系统输出打印项次(结果);
}捕获(例外e){
System.out.println(“从一个任务捕获异常:“+e.getCause().getMessage()+”。立即关机!”);
threadExecutor.shutdownNow();
打破
}
}
如何处理子线程中的中断?

立即关闭 列表关闭现在() 基于Javadoc: 尝试停止所有正在执行的任务,停止正在等待的任务的处理,并返回正在等待执行的任务的列表。 此方法不会等待主动执行的任务终止。使用此选项可以完成此操作


除了尽最大努力尝试停止处理积极执行的任务之外,没有其他保证例如,典型的实现将通过Thread.interrupt()取消,因此任何未能响应中断的任务可能永远不会终止。

您可以使用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);
    }
}

您有多少执行者?您是否对所有这些执行器都调用了实例方法
shutdownNow()
?我有两个执行器…一个在主线程中,另一个在其子线程中,该子线程创建了thread1和thread2。我对这两个执行器都调用了shutdownNow(),但我猜只有thread1和thread2执行器shutdownNow()根据我的多线程经验,你必须在每个线程上循环,并将其设置为null或终止,不管你现在怎么做。我通常喜欢通过实现Runnable来创建我的线程。只有在线程相互协作的情况下才能停止线程。如果它们产生子线程,它们也必须关心它们。要扩展zapl的观点:没有“停止线程”这样的事情。
shutdownow
只是中断每个线程。由每个Runnable和Callable的作者通过干净地退出来正确响应中断。您正在运行的任务可能不会产生中断事件,也不会响应中断事件。