【问题标题】:How to stop all threads in the tree?如何停止树中的所有线程?
【发布时间】: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


【解决方案1】:

立即关闭 列出 shutdownNow() 基于 Javadoc: 尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。 此方法不等待主动执行的任务终止。使用 awaitTermination 来做到这一点。

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

【讨论】:

  • 可能你正在运行的任务没有 Yield 并且没有响应中断事件。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多