首页 > 其他分享 >强大的三个工具类、CountDownLatch 闭锁 、CyclicBarrier 、Semaphore

强大的三个工具类、CountDownLatch 闭锁 、CyclicBarrier 、Semaphore

时间:2024-12-07 18:32:49浏览次数:3  
标签:String CountDownLatch CountryEnum 线程 Semaphore CyclicBarrier public

文章目录

①、CountDownLatch(闭锁) 做减法

②、CyclicBarrier做加法

③、Semaphore 信号量


一、 CountDownLatch(闭锁) 做减法


1、CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞


2、其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞)


3、计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行


A、利用枚举减少 if else 的判断

  public enum CountryEnum {

      one(1,"齐"),two(2,"楚"),three(3,"燕"),
      four(4,"赵"),five(5,"魏"),six(6,"韩");

      private Integer retCode;
      private String retMessage;

      private CountryEnum(Integer retCode,String retMessage){
          this.retCode=retCode;
          this.retMessage=retMessage;
      }

      public static CountryEnum getCountryEnum(Integer index){
          CountryEnum[] countryEnums = CountryEnum.values();
          for (CountryEnum countryEnum : countryEnums) {
              if(countryEnum.getRetCode()==index){
                  return countryEnum;
              }
          }
          return null;
      }

      public Integer getRetCode() {
          return retCode;
      }

      public String getRetMessage() {
          return retMessage;
      }
  }



  /*
  	楚	**国,被灭
  	魏	**国,被灭
  	赵	**国,被灭
  	燕	**国,被灭
  	齐	**国,被灭
  	韩	**国,被灭
  	main	**秦国一统江湖
  * */
  public class CountDownLatchDemo {
      public static void main(String[] args) throws Exception{
          CountDownLatch countDownLatch=new CountDownLatch(6);
          for (int i = 1; i <=6; i++) {
              new Thread(()->{
                  System.out.println(Thread.currentThread().getName()+"\t"+"**国,被灭");
                  countDownLatch.countDown();
              },CountryEnum.getCountryEnum(i).getRetMessage()).start();

          }
          countDownLatch.await();
          System.out.println(Thread.currentThread().getName()+"\t"+"**秦国一统江湖");
      }
  }


B、实验CountDownLatch去解决时间等待问题

public class AtomicIntegerDemo {
    AtomicInteger atomicInteger=new AtomicInteger(0);
    public void addPlusPlus(){
        atomicInteger.incrementAndGet();
    }
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch=new CountDownLatch(10);
        AtomicIntegerDemo atomic=new AtomicIntegerDemo();
        // 10个线程进行循环100次调用addPlusPlus的操作,最终结果是10*100=1000
        for (int i = 1; i <= 10; i++) {
            new Thread(()->{
               try{
                   for (int j = 1; j <= 100; j++) {
                       atomic.addPlusPlus();
                   }
               }finally {
                   countDownLatch.countDown();
               }
            },String.valueOf(i)).start();
        }
        //(1). 如果不加上下面的停顿3秒的时间,会导致还没有进行i++ 1000次main线程就已经结束了
        //try { TimeUnit.SECONDS.sleep(3);  } catch (InterruptedException e) {e.printStackTrace();}
        //(2). 使用CountDownLatch去解决等待时间的问题
        countDownLatch.await();
        System.out.println(Thread.currentThread().getName()+"\t"+"获取到的result:"+atomic.atomicInteger.get());
    }
}


二、 CyclicBarrier(环栅栏)做加法


1、 CyclicBarrier的字面意思是可循环(Cyclic) 使用的屏障(barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫做同步点)时被阻塞,知道最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await()方法


2、代码验证:

//集齐7颗龙珠就能召唤神龙
public class CyclicBarrierDemo {
    public static void main(String[] args) {
        // public CyclicBarrier(int parties, Runnable barrierAction) {}
        CyclicBarrier cyclicBarrier=new CyclicBarrier(7,()->{
            System.out.println("召唤龙珠");
        });
        for (int i = 1; i <=7; i++) {
            final int temp=i;
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"\t收集到了第"+temp+"颗龙珠");
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }).start();
        }

    }
}


三、 Semaphore 信号量


1、 acquire(获取)当一个线程调用acquire操作时,它要么通过成功获取信号量(信号量减1),要么一直等下去,直到有线程释放信号量,或超时


2、 release(释放)实际上会将信号量的值加1,然后唤醒等待的线程


3、 信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制


4、 代码验证

public class SemaphoreDemo {
    public static void main(String[] args) {
        Semaphore semaphore=new Semaphore(3);
        for (int i = 1; i <=6; i++) {
            new Thread(()->{
                try {
                    System.out.println(Thread.currentThread().getName()+"\t抢占了车位");
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName()+"\t离开了车位");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    semaphore.release();
                }
            },String.valueOf(i)).start();
        }
    }
}

标签:String,CountDownLatch,CountryEnum,线程,Semaphore,CyclicBarrier,public
From: https://www.cnblogs.com/jock766/p/18592513

相关文章

  • 多线程篇-7--线程通信(等待/通知机制,等待/超时机制,CountdownLatch,CyclicBarrier,Blockin
    1、线程为什么要通信?多线程的目的是多条线程执行不同的逻辑业务从而能够提升业务整体的响应速度,如果线程都是孤零零的执行,不同的逻辑业务就不能最终汇聚成一个完整的业务,那么多线程也就失去了意义,这就是为什么要有线程间通信的存在。线程间的通信可以是主、子线程通信,也可......
  • CountDownLatch的介绍
    CountDownLatch的介绍  CountDownLatch是JUC中的一个同步工具类,它可以帮助我们实现线程之间的同步和协作。它的核心思想是通过计数器来控制线程的执行顺序。当计数器的值降为0时,所有等待的线程都会被唤醒,然后开始执行下一步操作。1//Sync类继承自AbstractQueuedSynchro......
  • java 多线程同步方法CyclicBarrier/CountDownLatch/AtomicBoolean/Semaphore
    CyclicBarrier 有两个构造函数,CyclicBarrier(int),CyclicBarrier(int,Runnable)目的:通过输入任务数实现线程同步; 使用场景: 多线程计算:当多个线程需要分阶段并行处理数据,但在每一阶段结束时需要所有线程同步,以便开始下一阶段的处理。 并行任务协调:例如,在并行搜索或并行数......
  • CyclicBarrier的介绍
    CyclicBarrier的介绍  概要  CyclicBarrier(循环栅栏/循环屏障)是java.util.concurrent工具类里的一个工具,它是Java提供的一种特定场景下的多线程之间进行交互的使用方法。  CyclicBarrier作用是让一组线程相互等待,当达到一个共同点时,所有之前等待的线程再继续执行,且......
  • Java-CountDownLatch的用法
    一、使用场景        CountDownLatch也属于JUC。线程可以使用await()进行等待,多线程进行递减计数,等到计数到0的时候等待即不再阻塞,从而向下执行。在日常开发中经常会遇到需要在主线程中开启多个线程去并行执行任务,并且主线程需要等待所有子线程执行完毕后再进行汇总......
  • 操作系统(6) (Named /Unnamed Semaphore信号量详解)
    目录1:信号量的基本概念2:命名信号量的示例代码3.无名信号量(UnnamedSemaphore)背景(Background)示例代码讲解初始化无名信号量线程函数创建线程并等待完成销毁信号量总结4.对比1:信号量的基本概念背景介绍:信号量是一种并发编程中的同步原语,它用于协调多......
  • 信号量的秘密:Python中的Semaphore详解
    引言随着计算机硬件的发展,多核处理器已经成为了标准配置。这使得开发人员可以利用并发编程技术来提高应用程序的性能。然而,在并发环境下,资源共享和访问控制成了一个棘手的问题。Semaphore(信号量)就是一种常用的解决此类问题的技术。通过限制对共享资源的同时访问数量,Semapho......
  • linux semaphore信号量操作
    信号量(semaphore)是操作系统中最常见的同步原语之一。spinlock是实现忙等待锁,而信号量则允许进程进入睡眠状态。下面将分析信号量的获取是释放操作。1、数据结构数据结构定义和初始化如下:include/linux/semaphore.h/*Pleasedon'taccessanymembersofthisstruc......
  • 操作系统:线程间通信方式(下)——信号量机制 (Semaphore) 与信号机制 (Signal)
    操作系统:线程间通信方式(下)——信号量机制(Semaphore)与信号机制(Signal)在多线程编程中,线程间的通信与同步至关重要。信号量机制(Semaphore)和信号机制(Signal)是两种常见且重要的线程间通信方式,它们各自解决不同场景下的线程控制问题。本文将详细介绍信号量和信号的基本概......
  • Java多种方式实现 有界缓冲区下的多个生产者、消费者模型 (Semaphore、while+wait+noti
    /**@Author:SongyangJi@ProjectName:learn-multiThread@Version1.0@Description:*/classProducerThreadextendsThread{intrate;MultiProducerConsumermultiProducerConsumer;publicProducerThread(intrate,MultiProducerConsumermultiProducer......