• CountDownLatch和CyclicBarrier


    JUC(Java.util.concurrent)是Java 5中引入的一个并发编程库,它包含了许多用于多线程处理的工具类和接口。JUC主要提供了以下特性:

    1. 线程池:线程池可以提高线程的使用效率,避免频繁地创建和销毁线程,从而使得应用程序的性能得到提升。

    2. 并发集合类:JUC提供了一些线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等,可以在多线程环境下安全地操作集合。

    3. 原子操作类:JUC提供了一些原子操作类,如AtomicInteger、AtomicLong等,可以在多线程环境下安全地操作共享变量。

    4. 同步器:JUC提供了一些同步器,如Semaphore、CountDownLatch、CyclicBarrier等,可以协调多个线程之间的执行。

    5. 并发工具类:JUC还提供了一些并发工具类,如Lock、Condition等,可以代替传统的synchronized关键字,提供更灵活、更高效的线程同步机制。

    CountDownLatch和CyclicBarrier都是Java中用于多线程编程的工具类,属于同步器的一种。它们都可以用于控制多个线程的执行顺序。

     代码示例

    CountDownLatch 

    介绍

    CountDownLatch是一个计数器,通过它可以控制线程执行的先后顺序。它的作用是让某个线程等待若干个其他线程执行完后再执行。使用CountDownLatch时需要指定一个计数器的值,当所有计数器都为0时,等待线程才会继续执行。

    代码 

    1. public class TestCountDown {
    2. private static CountDownLatch cl=new CountDownLatch(4);
    3. public static void main(String[] args) {
    4. Thread thread1 = new Thread(() -> {
    5. try {
    6. System.out.println("start1");
    7. Thread.sleep(4000);
    8. cl.countDown();
    9. System.out.println("end1");
    10. } catch (InterruptedException e) {
    11. throw new RuntimeException(e);
    12. }
    13. });
    14. Thread thread2 = new Thread(() -> {
    15. try {
    16. System.out.println("start2");
    17. Thread.sleep(4000);
    18. cl.countDown();
    19. System.out.println("end2");
    20. } catch (InterruptedException e) {
    21. throw new RuntimeException(e);
    22. }
    23. });
    24. Thread thread3 = new Thread(() -> {
    25. try {
    26. System.out.println("start3");
    27. Thread.sleep(4000);
    28. cl.countDown();
    29. System.out.println("end3");
    30. } catch (InterruptedException e) {
    31. throw new RuntimeException(e);
    32. }
    33. });
    34. Thread thread4 = new Thread(() -> {
    35. try {
    36. System.out.println("start4");
    37. Thread.sleep(4000);
    38. cl.countDown();
    39. System.out.println("end4");
    40. } catch (InterruptedException e) {
    41. throw new RuntimeException(e);
    42. }
    43. });
    44. thread1.start();
    45. thread2.start();
    46. thread3.start();
    47. thread4.start();
    48. try {
    49. cl.await();
    50. } catch (InterruptedException e) {
    51. throw new RuntimeException(e);
    52. }
    53. System.out.println("ok");
    54. }
    55. }

    运行结果

     CyclicBarrier

     介绍

    CyclicBarrier也可以用于控制线程的顺序执行。它可以协调一组线程在某个屏障处等待并互相等待,直到所有线程都到达该屏障后再一起继续执行。CyclicBarrier可以重复使用,每次调用await()方法时,计数器的值都会减1,当计数器为0时,所有线程都会被释放。

    代码 

    1. public class TestCyclicBarrier {
    2. // 自定义工作线程
    3. private static class Worker extends Thread {
    4. private CyclicBarrier cyclicBarrier;
    5. public Worker(CyclicBarrier cyclicBarrier) {
    6. this.cyclicBarrier = cyclicBarrier;
    7. }
    8. @Override
    9. public void run() {
    10. super.run();
    11. try {
    12. System.out.println(Thread.currentThread().getName() + "开始等待其他线程");
    13. cyclicBarrier.await();
    14. System.out.println(Thread.currentThread().getName() + "开始执行");
    15. // 工作线程开始处理,这里用Thread.sleep()来模拟业务处理
    16. Thread.sleep(1000);
    17. System.out.println(Thread.currentThread().getName() + "执行完毕");
    18. } catch (Exception e) {
    19. e.printStackTrace();
    20. }
    21. }
    22. }
    23. public static void main(String[] args) {
    24. int threadCount = 3;
    25. CyclicBarrier cyclicBarrier = new CyclicBarrier(threadCount);
    26. for (int i = 0; i < threadCount; i++) {
    27. System.out.println("创建工作线程" + i);
    28. Worker worker = new Worker(cyclicBarrier);
    29. worker.start();
    30. }
    31. }
    32. }

    运行结果

    总结 

    总结来说,CountDownLatch是控制一个线程等待多个其他线程执行完毕后再执行,而CyclicBarrier是控制多个线程相互等待,直到所有线程都到达某个屏障后再一起继续执行。 

  • 相关阅读:
    js:lodash template文件模板语法和应用
    [附源码]Python计算机毕业设计SSM京津冀区域产学研项目管理信息系统(程序+LW)
    Spring Cloud Gateway:打造可扩展的微服务网关
    加密货币熊市导致收入骤降,穆迪将Coinbase降级
    人工智能、机器学习和深度学习
    Pod的调度机制
    一、配置环境
    跨站请求伪造
    vmware16.2内部win7联网
    虚拟交换缓存不足导致qt编译失败
  • 原文地址:https://blog.csdn.net/weixin_44808225/article/details/134552195