zoukankan      html  css  js  c++  java
  • CountDownLatch,CyclicBarrier,Semaphore用法

    1.让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒。

    2.CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,调用线程会被阻塞。其它线程调用countDown方法会将计算器减1(调用countDown方法的线程不会阻塞),当计数器的值变成零时,因调用await方法被阻塞的线程会被唤醒,继续执行。

    例子:

    1.先定义一个枚举类

    public enum CountryEnum {
    ONE(1,"齐"),TWO(2,"楚"),THREE(3,"燕"),FOUR(4,"赵"),FIVE(5,"魏"),SIX(6,"韩");
    @Getter private Integer retCode;
    @Getter private String retMessage;

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

    public static CountryEnum forEach(int index) {
    CountryEnum[] myArray = CountryEnum.values();
    for(CountryEnum countryEnum : myArray) {
    if(index == countryEnum.getRetCode()) {
    return countryEnum;
    }
    }
    return null;
    }
    }

    2.
    public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
    CountDownLatch countDownLatch = new CountDownLatch(6);
    for(int i = 1; i<= 6; i++) {
    new Thread(() ->{
    countDownLatch.countDown();
    System.out.println(Thread.currentThread().getName()+" 国灭");
    },CountryEnum.forEach(i).getRetMessage()).start();
    }
         //等待上面结果执行完
    countDownLatch.await();
    System.out.println(Thread.currentThread().getName()+" ******秦国统一六国");

    }
    }

    运行结果见下图:


    CyclicBarrier用法

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

    集齐7颗龙珠就能召唤神龙

    public class CyclicBarrierDemo {
    public static void main(String[] args) {
    CyclicBarrier cyclicBarrier = new CyclicBarrier(7,() ->{
    System.out.println("7颗龙珠收集完成,召唤神龙");
    });

    for(int i = 1; i <= 7; i++) {
    final int tempInt = i;
    new Thread(() ->{
    System.out.println(Thread.currentThread().getName()+" 收集到"+tempInt+"龙珠");
    try {
    cyclicBarrier.await();
    } catch (InterruptedException e) {
    e.printStackTrace();
    } catch (BrokenBarrierException e) {
    e.printStackTrace();
    }
    },String.valueOf(i)).start();
    }
    }
    }

    运行结果见下图:

     注意,如果new CyclicBarrier(7,**)里面的未满足7次线程使用的话,程序将陷入等待状态,死循环。


    Semaphore 用法:

    信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制,下面例子模拟6部汽车抢3个车位

    public class SemaphoreDemo {
    public static void main(String[] args) {
    Semaphore semaphore = new Semaphore(3);//模拟3个停车位

    for(int i = 0; i <=6; i++) { //模拟6部汽车
    new Thread(() ->{
    try {
    semaphore.acquire();
    System.out.println(Thread.currentThread().getName()+" 抢到车位");
    TimeUnit.SECONDS.sleep(3);
    System.out.println(Thread.currentThread().getName()+" 停车3秒后离开车位");
    } catch (InterruptedException e) {
    e.printStackTrace();
    } finally {
    semaphore.release();
    }
    },String.valueOf(i)).start();
    }
    }
    }

    运行结果见下图:

  • 相关阅读:
    android studio 手把手叫你NDK开发环境搭建及基础使用
    android——Tinker启蒙,献给热修复一脸懵逼的自己
    android——webview拦截跳转指定url后,点击返回界面重定向的问题
    android——使用Ijkplayer打造自己的超级电视台播放软件
    android——webview解决goback()后,界面会刷新的问题
    android——webview动态修改html界面
    android——webview修改html界面,达到去除或隐藏部分界面的效果
    项目总结——开篇
    android——使用观察者模式打造跨线程、跨界面等一对多通讯
    使用material design 打造炫酷的“宜城头条”app
  • 原文地址:https://www.cnblogs.com/liuyi13535496566/p/12150440.html
Copyright © 2011-2022 走看看