并发工具使用【CountDownLatch,CyclicBarrier】--代码示例 ﹏ヽ暗。殇╰゛Y 2024-04-18 11:14 31阅读 0赞 ## 1.CountDownLatch 的使用 ## ### 应用场景: ### 等待已知数量的线程执行完后 ,在唤醒当前的主线程的应用场景,比如:查询所有航空公司的机票,多个线程单独执行查询单个航空公司的机票,所有的单个线程结束后,环境主线程,将结果输出。 相当于计数器进行减的操作 ### 实例代码: ### package com.lhj; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; public class CountDownLatchDemo { //针对航班查询进行举例 private static List<String> company = Arrays.asList("东方航空", "南方航空", "海南航空"); private static List<String> fightList = new ArrayList<>(); public static void main(String[] args) throws InterruptedException { String origin = "PEK"; String dest = "pvg"; Thread[] threads = new Thread[company.size()]; CountDownLatch countDownLatch = new CountDownLatch(company.size()); for (int i = 0; i < threads.length; i++) { final String companyName = company.get(i); threads[i] = new Thread(() -> { System.out.println(companyName + "查询飞机票从"+origin+"到" + dest); //随机产生票数 int paperNum = new Random().nextInt(10); try { TimeUnit.SECONDS.sleep(paperNum); } catch (InterruptedException e) { e.printStackTrace(); } fightList.add(companyName + "--" + paperNum); System.out.printf("%s公司查询成功!\n", companyName); countDownLatch.countDown(); }); threads[i].start(); } countDownLatch.await(); System.out.println("==============查询结果如下:================"); fightList.forEach(System.out::println); } } ### 运行结果 ### ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70][] ## 2.CyclicBarrier的使用 ## ### 应用场景: ### 等待所有线程开启完成后,唤醒主线程,例如 等该所有参赛的运动员参赛全部到位后,开始比赛 相当于计数器进行加的操作 ### 示例代码: ### import java.util.Random; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.TimeUnit; public class CyclicBarrierDemo { public static void main(String[] args) { Thread[] running = new Thread[8]; CyclicBarrier cyclicBarrier = new CyclicBarrier(running.length); for (int i = 0; i < running.length; i++) { running[i] = new Thread(() -> { try { TimeUnit.SECONDS.sleep(new Random().nextInt(10)); System.out.println(Thread.currentThread().getName() + "准备好了!"); cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println("选手" + Thread.currentThread().getName() + "起跑"); }, "player" + i); running[i].start(); } } } ### 运行结果: ### ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 1][] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/18/f3f28710b41949299dbb962457cd8595.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MzA2MDQx_size_16_color_FFFFFF_t_70 1]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/18/8eca3823fa1949848632f335d411b776.png
相关 Java并发工具库(如CyclicBuffer)使用示例 Java的并发工具库,比如`CyclicBuffer`,是一种线程安全且有容量限制的数据结构。在多线程环境下,它能有效避免数据竞争问题。 以下是一个使用`CyclicBuff 偏执的太偏执、/ 2024年09月21日 02:36/ 0 赞/ 7 阅读
相关 Java并发编程:CountDownLatch、CyclicBarrier等工具使用示例 Java的`CountDownLatch`, `CyclicBarrier`是两种常用的同步工具,用于多线程之间的协调和控制。 1. CountDownLatch Coun 矫情吗;*/ 2024年09月20日 06:33/ 0 赞/ 7 阅读
相关 并发控制:Java并发工具类(如Semaphore,CountDownLatch等)的使用示例? Java中的并发工具类主要是用于管理线程间的协作,防止数据竞争。以下是一些常用的并发工具类及其使用示例: 1. `Semaphore`(信号量):表示在同一时刻允许的最多线程 谁借莪1个温暖的怀抱¢/ 2024年09月19日 09:45/ 0 赞/ 13 阅读
相关 Java并发工具库简介及使用示例 Java并发工具库,也被称为java.util.concurrent包,是Java标准库的一部分,专门为处理多线程环境中的任务调度、线程管理等提供了丰富的类和接口。 以下是一 爱被打了一巴掌/ 2024年09月18日 19:24/ 0 赞/ 6 阅读
相关 理解Java的并发工具:八种使用场景示例 Java的并发工具是Java平台提供的一系列用于处理多线程任务的类和接口。以下列举了八种常见的使用场景及示例: 1. **线程池**: 用于管理一组可重用的线程,避免频 向右看齐/ 2024年09月12日 18:09/ 0 赞/ 12 阅读
相关 Java并发工具类使用误区:示例剖析 在Java并发编程中,一些常用的工具类如`ExecutorService`, `Callable`, `Future`, 等如果使用不当,可能会导致错误或者性能问题。这里我们将 ╰+攻爆jí腚メ/ 2024年09月12日 17:12/ 0 赞/ 17 阅读
相关 Java并发工具类如Lock和Semaphore使用示例 在Java中,`Lock`和`Semaphore`都是常用的并发工具类。下面我将分别给出它们的使用示例。 1. `Lock`: `Lock`提供了独占锁的控制,它可以确保一 蔚落/ 2024年09月12日 16:54/ 0 赞/ 17 阅读
相关 Java并发工具库:CountDownLatch、Semaphore和CyclicBarrier使用示例 Java的并发工具库包括`CountDownLatch`,`Semaphore`和`CyclicBarrier`。这些类帮助我们管理多线程环境中的资源共享和同步。 以下是这几 傷城~/ 2024年09月10日 16:45/ 0 赞/ 22 阅读
相关 并发工具使用【CountDownLatch,CyclicBarrier】--代码示例 1.CountDownLatch 的使用 应用场景: 等待已知数量的线程执行完后 ,在唤醒当前的主线程的应用场景,比如:查询所有航空公司的机票,多个线程... ﹏ヽ暗。殇╰゛Y/ 2024年04月18日 11:14/ 0 赞/ 32 阅读
还没有评论,来说两句吧...