import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;
import static java.util.stream.Collectors.toList;
import static java.util.concurrent.ThreadLocalRandom.current;
/**
* @desc CountDownLatch 的使用案例
**/
public class CountDownLatchExample1
{
public static void main(String[] args) throws InterruptedException
{
final int[] productsByCategoryId = getProductsByCategoryId();
List<ProductPrice> collect = Arrays.stream(productsByCategoryId).mapToObj(ProductPrice::new).collect(toList());
// 定义CountDownLatch , 计数器数量为“子任务的个数”
final CountDownLatch latch = new CountDownLatch(productsByCategoryId.length);
collect.forEach(pp->
new Thread(() ->{
System.out.println(pp.getProdId() + " -> start calculate price.");
// 模拟其他系统的调用,比较耗时,这里用休眠替代
try
{
TimeUnit.SECONDS.sleep(current().nextInt(10));
if( pp.prodId % 2 == 0)
{
pp.setPrice(pp.prodId * 0.9D);
}else
{
pp.setPrice(pp.prodId * 0.7D);
}
System.out.println(pp.getProdId() + " -> price calculate completed.");
}
catch (InterruptedException e)
{
e.printStackTrace();
}
finally
{
// 计数器 count down ,子任务执行完成
latch.countDown();
}
}).start()
);
// 主线程等待所有的子任务结束,如果有一个子任务没有完成则会一直等待
latch.await();
System.out.println("all of prices calculate finished.");
collect.forEach(System.out::println);
}
private static int[] getProductsByCategoryId()
{
return IntStream.rangeClosed(1,10).toArray();
}
private static class ProductPrice
{
private final int prodId;
private double price;
private ProductPrice(int prodId)
{
this(prodId,-1);
}
private ProductPrice(int prodId,double price)
{
this.prodId = prodId;
this.price = price;
}
public int getProdId()
{
return prodId;
}
public double getPrice()
{
return price;
}
public void setPrice(double price)
{
this.price = price;
}
@Override
public String toString()
{
return "ProductPrice{" + "prodId=" + prodId + ", price=" + price + '}';
}
}
}
CountDownLatch 的使用案例
最新推荐文章于 2025-02-27 16:25:28 发布
本文介绍如何使用CountDownLatch在Java中实现多个子线程并发计算商品价格,通过模拟耗时操作演示了如何确保所有任务完成后主线程继续执行。
1339

被折叠的 条评论
为什么被折叠?



