如何阻止树中的所有线程?

时间:2016-06-17 15:37:34

标签: java multithreading java.util.concurrent

如果我在主线程中执行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;
                            }
                        }

如何处理子线程中断?

2 个答案:

答案 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);
    }
}