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 的使用案例
最新推荐文章于 2023-05-31 20:39:46 发布
关键词由CSDN通过智能技术生成