Java 倒计时锁';s latch.await()方法与Thread.join()的比较

Java 倒计时锁';s latch.await()方法与Thread.join()的比较,java,multithreading,Java,Multithreading,我看到一个stackoverflow成员建议使用Thread.join()让一个“主”线程等待2个“任务”线程完成 我会经常做一些不同的事情(如下所示),我想知道我的方法是否有任何问题 final CountDownLatch latch = new CountDownLatch(myItems.length); for (Item item : myItems) { //doStuff launches a Thread that calls latch.countDown() as

我看到一个stackoverflow成员建议使用Thread.join()让一个“主”线程等待2个“任务”线程完成

我会经常做一些不同的事情(如下所示),我想知道我的方法是否有任何问题

final CountDownLatch latch = new CountDownLatch(myItems.length);

for (Item item : myItems) {  
  //doStuff launches a Thread that calls latch.countDown() as it's final act  
  item.doStuff(latch);   
}

latch.await();  //ignoring Exceptions for readability

您的解决方案更易于扩展。join()是在创建CountdownLatch和其他同步器之前解决问题的一种非常好的方法


在可读性方面,我会选择倒计时锁存方法,而不是在每个线程上进行连接。这还允许您将项的实现更改为提交到Executor服务,而不是直接使用线程。

倒计时闩锁更适合于同时启动所有线程。

我更喜欢使用Future(如果使用Executor服务,则很容易)。然后在提交所有任务后等待它们全部完成

 Collection<Future<Void>> futures = new ArrayList<Future<Void>>(myItems.length());
 for ( Runnable item : myItems ) {
     futures.add(executor.submit(item, null));

 for ( Future<Void> future : futures ) 
     future.get();  //easy to add a timeout here
Collection futures=newarraylist(myItems.length());
对于(可运行项:myItems){
添加(执行人提交(项目,空));
for(未来:未来)
future.get();//在此处添加超时很容易
最后一个for循环可以很容易地分离成一个实用的方法。这封装了同步,并且很容易添加超时


它也更适用于一般情况,工作线程实际上需要返回一个结果(如果您不关心工作线程最终会做什么,为什么需要等待它们呢?)

我一直认为我应该研究一下未来的类?/inteface?我正在试图了解CondownLatch/CyclicBarrier在未来提供了什么。get()。有用的实用程序代码?