Java - 如何告诉所有子线程已完成

Art*_*rez 2 java multithreading runnable java-8

我想同时运行一些任务,所以我有一个代码如下:

for(final Task task : tasks){
    (new Thread(){public void run(){
        task.run(args);
}}).start();
Run Code Online (Sandbox Code Playgroud)

我怎么知道所有任务何时完成(任务量可以变化),以便我可以在完成所有任务后运行某些东西?

System.out.println("All tasks are finished");
Run Code Online (Sandbox Code Playgroud)

VGR*_*VGR 5

而不是显式创建Threads,将Runnables提交给ExecutorService,然后调用其shutdownawaitTermination方法:

ExecutorService executor = Executors.newFixedThreadPool(tasks.size());

for (final Task task : tasks) {
    executor.submit(new Runnable() {
        @Override
        public void run() {
            task.run(args);
        }
    });
}

executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLSECONDS);
Run Code Online (Sandbox Code Playgroud)

  • 或者,不是终止线程池(如果你想使用现有的线程池),你可以使用`ExecutorService.invokeAll()`并等待生成的`Future`s. (4认同)

Pet*_*rey 5

较短的版本是使用parallelStream

tasks.parallelStream().forEach(t -> t.run(args));
Run Code Online (Sandbox Code Playgroud)

这将使用您拥有的所有CPU(如果您有足够的任务)运行所有任务,并等待全部完成.