主线程/调用线程等待其他线程完成任务的最佳方法是什么?我想出了两个选择;可能还有更多
选项1 - Thread.sleep()
new Thread(() -> System.out.println("Executed task 1")).start();
new Thread(() -> System.out.println("Executed task 2")).start();
Thread.sleep(1000);
选项2 -锁存
CountDownLatch latch = new CountDownLatch(2);
new Thread(() -> {
System.out.println("Executed task 1");
latch.countDown();
}).start();
new Thread(() -> {
System.out.println("Executed task 2");
latch.countDown();
}).start();
latch.await(1, TimeUnit.SECONDS);
选项3 - CompletableFuture
CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> System.out.println("Executed task 1"));
CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> System.out.println("Executed task 2"));
CompletableFuture.allOf(future1, future2).join();
选项4 - ??
使用Thread.join()
:
Thread t1 = new Thread(...);
Thread t2 = new Thread(...);
t1.start();
t2.start();
t1.join();
t2.join();
使用Thread.sleep
的问题是,很明显,不能保证线程已经完成;但是,如果线程立即完成,它也可能等待长达1秒的时间过长。
但是有一个更重要的问题,那就是当你使用它时,你没有得到内存一致性保证:不能保证线程中完成的工作在睡眠后对等待线程可见。
使用join()
或await(...)
可以保证内存一致性。