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();
    }
    }
    }

    运行结果见下图:

  • 相关阅读:
    Lucene.NET中Field.Index 和 Field.Store的几种属性的用法
    WP7学习笔记(三)
    sql注入
    JSP数据库开发实例
    oracle命令大全(转)
    .net个人涉及
    JavaScript的错误处理之onerror事件的使用方法
    脚本问题。调试
    做到了,你就成熟
    ea8.0
  • 原文地址:https://www.cnblogs.com/liuyi13535496566/p/12150440.html
Copyright © 2011-2022 走看看