美文网首页
Java同步工具类

Java同步工具类

作者: superHang | 来源:发表于2020-04-24 16:24 被阅读0次

同步工具类--能够更好控制线程之间的通讯问题
1.CountDownLatch(闭锁)
2.CyclicBarrier(栅栏)
3.Semaphore(信号量)

CountDownLatch

CountDownLatch是一个同步的辅助类,允许一个或多个线程一直等待,直到其它线程完成它们的操作。它常用的API其实就两个:await()和countDown()

CountDownLatch 例子1

小华 小杰 和小虎三兄弟相约吃饭,但是小华很墨迹啊又得梳头洗澡干啥的,就要他的两个朋友等他

public static void main(String [] args){
        //定义计数器,线程等待的计数
        final CountDownLatch countDownLatch=new CountDownLatch(1);
        //启动一个线程相当于小华  小华在洗澡
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    //等待中。。。。
                    Thread.sleep(10);
                }catch (Exception e){
                    e.printStackTrace();
                }
                System.out.println("小华搞完了");
                //线程计数器减一
                countDownLatch.countDown();
            }
        }).start();

       //启动两个线程相当于小华的朋友,在等待。。。
        for(int i=1;i<=2;i++){
            int finalI = i;
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Thread.currentThread().setName("朋友"+ finalI);
                    System.out.println(Thread.currentThread().getName()+"等待小华。。。");
                    try{
                        //线程等待,就会跳到小华的线程继续执行
                        countDownLatch.await();
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"出发。。。。");
                }
            }).start();
        }
    }
image.png

CountDownLatch 例子2

小华上次让他的两个朋友等了很久呀,所以这次他的两个朋友也开始搞事情,让小华等他们两个人

 public static void main(String[] args) {
        final CountDownLatch countDownLatch = new CountDownLatch(2);

        System.out.println("小华和朋友相约吃饭。。。。");
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    System.out.println("风水轮流转,小华等待朋友。。。");
                    //小华等待。。的时候他的两个朋友正在搞事情
                    countDownLatch.await();
                }catch (Exception e){
                    e.printStackTrace();
                }
                System.out.println("两个朋友都搞完了,终于可以出发了。。。");
            }
        }).start();


        for (int i = 1; i <= 2; i++) {
            int finalI = i;
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    Thread.currentThread().setName("朋友"+finalI);
                    System.out.println(Thread.currentThread().getName()+"搞事情,为了给小华一个教训。。");
                    countDownLatch.countDown();
                    System.out.println(Thread.currentThread().getName()+"搞完了。。");
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }).start();

    }
}
image.png

countDownLanch 就是一个或者多个线程等待其他线程。。等其他线程搞完事情了,再执行被等待的线程

CyclicBarrier

栅栏嘛,就是前面有一个栏杆,就像地铁限流的时候,所有人都在等待可以通行的信号,强调的是状态,所有的线程在某个状态下停下来,等待其他的线程,当所有的线程都到达了这个状态后,再执行

还是小华 和他的两个朋友一起相约吃完饭后,宵夜 KTV 一条龙
这个状态就是大家都吃完饭

 public static void main(String[] args){
        final CyclicBarrier cyclicBarrier=new CyclicBarrier(3);

       // new Thread(()->{ }).start();

        for(int i=1;i<=3;i++){
            int finalI=i;
            new Thread(new Runnable() {
                @Override
                public void run() {
                    String name="小华";
                    try{
                    if(finalI==1){
                        name="小杰";
                    }else if(finalI==2){
                        name="小虎";
                    }else{
                        name="小华";
                    }
                    System.out.println("等"+ name+"吃完饭。。。。");
                    cyclicBarrier.getNumberWaiting();
                    cyclicBarrier.await();
                    System.out.println("然后一起去happy...");
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }
image.png

Semaphore(信号量)

1.acquire()方法时,会消费一个许可证。如果没有许可证了,会阻塞起来

2.release()方法时,会添加一个许可证

又是小华,他们昨天晚上happy 之后,感觉身体太虚了,就相约去篮球场比赛投篮,只有一个球,所以他们在一个人投篮的时候要进行等待,一个人投完之后另一个人才能投

public static void main(String args[]){

        //凭证数量为1
        Semaphore semaphore=new Semaphore(1);
        System.out.println("投篮比赛开始了。。。");
        //启用3个线程
        for(int i=1;i<=3;i++){
            int finalI=i;
            new Thread(()->{
                String name="";
              try{
                  if(finalI==1){
                      name="小华";
                  }else if(finalI==2){
                      name="小杰";
                  }else{
                      name="小虎";
                  }
                  System.out.println("轮到"+name+"投篮");
                  //当调用acquire()方法时,会消费一个许可证。如果没有许可证了,会阻塞起来。一个人投篮的时候,其他人只能看着
                  semaphore.acquire();
                  // 投篮花费的时间
                  Thread.sleep(1000);
                  //当调用release()方法时,会添加一个许可证。就是下一个人可以继续投篮了
                  semaphore.release();
              }catch (Exception e){
                  e.printStackTrace();
              }
            }).start();
        }
    }
image.png

1.CountDownLatch(闭锁) 强调的是等待 1个等多个或者多个等一个
2.CyclicBarrier(栅栏) 强调的是状态 在某个状态下等待
3.Semaphore(信号量) 强调的是凭证,有凭证的为所欲为,没有的只能等待,要消费凭证

相关文章

  • Java同步工具类

    1. CountDownlatch(计数器) 描述: 一个同步工具类,允许一个或多个线程等待其它线程完成操作 类图...

  • Java同步工具类

    同步工具类--能够更好控制线程之间的通讯问题1.CountDownLatch(闭锁)2.CyclicBarrier...

  • 23-同步工具类之CountDownLatch、CyclicBa

    同步工具类之CountDownLatch、CyclicBarrier和Semaphore 在java 1.5中,提...

  • java线程之CountDownLatch类

    java.util.concurrent.CountDownLatch 类是JDK提供的同步工具类, 其功能大致是...

  • 同步工具类

    常见同步工具类 闭锁 FutureTask 信号量 栅栏 阻塞队列 构建自己的同步工具类 介绍 同步工具类可以是任...

  • JAVA多线程-CyclicBarrier同步屏障

    一、概述 CyclicBarrier,也是位于java.util.concurrent包下的一个并发同步工具类,光...

  • CountDownLatch、Semaphore等4大并发工具类

    Java并发工具包 1.并发工具类 提供了比synchronized更加高级的各种同步结构:包括CountDown...

  • Java并发之同步工具类

    同步工具类 同步工具类可以是任何一个对象,只要他根据自身的状态来协调线程的控制流.阻塞队列可以作为同步工具类,其他...

  • 常用Java线程同步工具类

    前言 本篇简单介绍Android以及Java提供了的数据并发类。 什么是锁 并发锁分为两种,一种是悲观锁synch...

  • CountDownLatch使用

    CountDownLatch使用 CountDownLatch是java中的一个同步工具类.用于对线程的阻塞和唤醒...

网友评论

      本文标题:Java同步工具类

      本文链接:https://www.haomeiwen.com/subject/qmbxwhtx.html