首页 > 解决方案 > 等待主线程直到ExecutorService的所有线程池任务完成?

问题描述

我需要主线程等到所有线程池任务完成。怎么做?例如:我有程序:

  public static void main(String[] args){

        ExecutorService executor = Executors.newFixedThreadPool(2);
        Map<String,String> test = new HashMap<String,String>(){{
            put("a","b");
            put("c","b");

        }};
        for(String t: test.keySet()) {
            executor.execute(new Runnable() {
                public void run() {
                    for(int i=0;i<100;i++){
                        System.out.println("t = " + t);
                    }

                }
            })
            ;
        }

        executor.shutdown();

        System.out.println("outside");;
    }

在上面的代码中,我想在 ExecutorService 任务完成后总是在最后打印“outside”。

标签: javamultithreading

解决方案


使用 Executor 时,我们可以通过调用 shutdown() 或 shutdownNow() 方法将其关闭。虽然,它不会等到所有线程停止执行。(这就是为什么在您的代码中“外部”首先打印而不是最后打印)。
等待现有线程完成它们的执行可以通过使用awaitTermination()方法来实现,该方法阻塞线程直到所有任务完成它们的执行或达到指定的超时

改变

executor.shutdown();

            executor.shutdown();
            try {
                if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
                    executor.shutdownNow();
                }
            } catch (InterruptedException ex) {
                executor.shutdownNow();
                Thread.currentThread().interrupt();
            }

推荐阅读