CountDownLatch

让一些线程堵塞直到另一个线程完成一系列操作后才被唤醒。CountDownLatch 主要有两个方法,当一个或多个线程调用 await 方法时,调用线程会被堵塞,其他线程调用 countDown 方法会将计数减一(调用 countDown 方法的线程不会堵塞),当计数其值变为零时,因调用 await 方法被堵塞的线程会被唤醒,继续执行。

假设我们有这么一个场景,教室里有班长和其他6个人在教室上自习,怎么保证班长等其他6个人都走出教室在把教室门给关掉。

public class CountDownLanchDemo {
public static void main(String[] args) {
for (int i = 0; i < 6; i++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " 离开了教室...");
}, String.valueOf(i)).start();
}
System.out.println("班长把门给关了,离开了教室...");
}
} 0 离开了教室...
1 离开了教室...
2 离开了教室...
3 离开了教室...
班长把门给关了,离开了教室...
5 离开了教室...
4 离开了教室...

发现班长都没有等其他人理他教室就把门给关了,此时我们就可以使用 CountDownLatch 来控制

public class CountDownLanchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(6);
for (int i = 0; i < 6; i++) {
new Thread(() -> {
countDownLatch.countDown();
System.out.println(Thread.currentThread().getName() + " 离开了教室...");
}, String.valueOf(i)).start();
}
countDownLatch.await();
System.out.println("班长把门给关了,离开了教室...");
}
}
0 离开了教室...
1 离开了教室...
2 离开了教室...
3 离开了教室...
4 离开了教室...
5 离开了教室...
班长把门给关了,离开了教室...
 

使用枚举完成countDownLatch案例

@Setter
@Getter
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(()->{
System.out.println(Thread.currentThread().getName()+"国被灭.......");
countDownLatch.countDown();
},CountryEnum.getcountryEnum(i).getName()+"").start();
} countDownLatch.await(); System.out.println(CountryEnum.seven+"国一统华夏");
}
} @Getter
enum CountryEnum {
one(1, "齐", "100", "demaxiya1"),
two(2, "楚", "100", "demaxiya1"),
three(3, "燕", "100", "demaxiya1"),
four(4, "韩", "100", "demaxiya1"),
five(5, "赵", "100", "demaxiya1"),
six(6, "巍", "100", "demaxiya1"),
seven(7, "秦", "100", "demaxiya1");
private Integer id; private String name;
private String time;
private String beizhu; CountryEnum(Integer id, String name, String time, String beizhu) {
this.id = id;
this.name = name;
this.time = time;
this.beizhu = beizhu;
}
public static CountryEnum getcountryEnum(Integer id ){
for (CountryEnum value : values()) {
if (value.id==id){
return value;
}
}
return null;
}
}

打印

齐国被灭.......
燕国被灭.......
楚国被灭.......
韩国被灭.......
巍国被灭.......
赵国被灭.......
seven国一统华夏

 

、CyclicBarrier(集齐七颗龙珠召唤神龙)

  1. CycliBarrier

    可循环(Cyclic)使用的屏障。让一组线程到达一个屏障(也可叫同步点)时被阻塞,知道最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CycliBarrier的await()方法

  2. 代码示例:

    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier; public class CyclicBarrierDemo {
    public static void main(String[] args) {
    cyclicBarrierTest();
    } public static void cyclicBarrierTest() {
    CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {
    System.out.println("====召唤神龙=====");
    });
    for (int i = 1; i <= 7; i++) {
    final int tempInt = i;
    new Thread(() -> {
    System.out.println(Thread.currentThread().getName() + "\t收集到第" + tempInt + "颗龙珠");
    try {
    cyclicBarrier.await();
    } catch (InterruptedException e) {
    e.printStackTrace();
    } catch (BrokenBarrierException e) {
    e.printStackTrace();
    }
    }, "" + i).start();
    }
    }
    }

    打印

    2 收集到第2颗龙珠
    3 收集到第3颗龙珠
    1 收集到第1颗龙珠
    5 收集到第5颗龙珠
    4 收集到第4颗龙珠
    6 收集到第6颗龙珠
    7 收集到第7颗龙珠
    ====召唤神龙=====

     

    3、Semaphore信号量

    可以代替Synchronize和Lock

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

    2. 代码示例:

      抢车位示例:

  3. package juc.lock.SemaphoreDemo;
    
    import java.util.concurrent.Semaphore;
    
    /**
    * @Classname SemaphoreDemo
    * @Description TODO
    * @Date 2020/7/13 23:03
    * @Created by imp
    */
    public class SemaphoreDemo { public static void main(String[] args) {
    Semaphore semaphore=new Semaphore(3); //3个车位 for (int i = 0; i < 6; i++) {
    new Thread(()->{
    try {
    //抢占车位
    semaphore.acquire();
    System.out.println(Thread.currentThread().getName()+"\t抢占到车位");
    Thread.sleep(2000);
    System.out.println(Thread.currentThread().getName()+"\t停两秒钟离开");
    } catch (InterruptedException e) {
    e.printStackTrace();
    }finally {
    semaphore.release();
    }
    },String.valueOf(i)).start();
    }
    }
    }

    打印:

    0 抢占到车位
    1 抢占到车位
    4 抢占到车位
    0 停两秒钟离开
    5 抢占到车位
    1 停两秒钟离开
    4 停两秒钟离开
    2 抢占到车位
    3 抢占到车位
    5 停两秒钟离开
    3 停两秒钟离开
    2 停两秒钟离开

     

CountDownLatch/CyclicBarrier/Semaphore 使用过吗的更多相关文章

  1. 并发包下常见的同步工具类详解(CountDownLatch,CyclicBarrier,Semaphore)

    目录 1. 前言 2. 闭锁CountDownLatch 2.1 CountDownLatch功能简介 2.2 使用CountDownLatch 2.3 CountDownLatch原理浅析 3.循环 ...

  2. CountDownLatch/CyclicBarrier/Semaphore 使用过吗?

    CountDownLatch/CyclicBarrier/Semaphore 使用过吗?下面详细介绍用法: 一,(等待多线程完成的)CountDownLatch  背景; countDownLatch ...

  3. Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo

    Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo CountDownLatch countDownLatch这个类使一个线程等待其他线程 ...

  4. 并发包下常见的同步工具类(CountDownLatch,CyclicBarrier,Semaphore)

    在实际开发中,碰上CPU密集且执行时间非常耗时的任务,通常我们会选择将该任务进行分割,以多线程方式同时执行若干个子任务,等这些子任务都执行完后再将所得的结果进行合并.这正是著名的map-reduce思 ...

  5. Java中的4个并发工具类 CountDownLatch CyclicBarrier Semaphore Exchanger

    在 java.util.concurrent 包中提供了 4 个有用的并发工具类 CountDownLatch 允许一个或多个线程等待其他线程完成操作,课题点 Thread 类的 join() 方法 ...

  6. 高并发第十单:J.U.C AQS(AbstractQueuedSynchronizer) 组件:CountDownLatch. CyclicBarrier .Semaphore

    这里有一篇介绍AQS的文章 非常好: Java并发之AQS详解 AQS全名:AbstractQueuedSynchronizer,是并发容器J.U.C(java.lang.concurrent)下lo ...

  7. CountDownLatch CyclicBarrier Semaphore 比较

    document CountDownLatch A synchronization aid that allows one or more threads to wait until a set of ...

  8. 多线程中 CountDownLatch CyclicBarrier Semaphore的使用

    CountDownLatch 调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行.也可以传入时间,表示时间到之后,count还没有为0的时候,就会继续执行. package ...

  9. 等待某(N)个线程执行完再执行某个线程的几种方法(Thread.join(),CountDownLatch,CyclicBarrier,Semaphore)

    1.main线程中先调用threadA.join() ,再调用threadB.join()实现A->B->main线程的执行顺序 调用threadA.join()时,main线程会挂起,等 ...

  10. 并发工具类的使用 CountDownLatch,CyclicBarrier,Semaphore,Exchanger

    1.CountDownLatch 允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助. A CountDownLatch用给定的计数初始化. await方法阻塞,直到由于countDo ...

随机推荐

  1. Gitlab勾选Remove Source Branch后本地仍然能够看到该分支

    现象: Gitlab合并Merge Request时,勾选了Remove Source Branch,但是本地仍然能够看到该分支(git branch -a),而远程仓库中该分支已经不存在. 解决: ...

  2. CSS基础-Flexbox

    flexbox 是一种一维的布局模型,它给 flexbox 的子元素之间提供了强大的空间分布和对齐能力. 说 flexbox 是一种一维的布局,是因为一个 flexbox 一次只能处理一个维度上的元素 ...

  3. Panda Global获悉,美国承诺4年内明确区块链数字资产监管方式!

    近日,美国商品期货交易委员会(CFTC)宣布,在4年内将会全面把加密货币监管列为优先事项.Panda Global从7月8日公布的新战略中获悉,此次CFTC公布了自己接下来的新框架,并且在框架中承诺: ...

  4. AcWing 332. 股票交易

    大型补档计划 题目链接 \(f[i][j]\) 表示前 \(i\) 天,手里有 \(j\) 个股票挣得最多钱 买股票.枚举 \(u < i - W\) \(f[i][j] = max(f[u][ ...

  5. 【APIO2019】路灯(ODT & (树套树 | CDQ分治))

    Description 一条 \(n\) 条边,\(n+1\) 个点的链,边有黑有白.若结点 \(a\) 可以到达 \(b\),需要满足 \(a\to b\) 的路径上的边不能有黑的.现给出 \(0\ ...

  6. kylin的实现原理

    摘自https://blog.bcmeng.com/post/kylin-cube.html#kylin%E7%9A%84%E9%A2%84%E8%AE%A1%E7%AE%97%E6%98%AF%E5 ...

  7. 最详细Python批量字典暴力破解zip密码

    工具破解 前两天在网上下来了一波项目案例,结果全是加密的压缩包,于是去网上找了一个压缩包破解的工具 苦于工具破解太慢,一个压缩包要好久,解压了三个之后就放弃了,准备另寻他法 密码字典 巧的是破解的三个 ...

  8. windows 10 1909 无法启用 .NET Framework 解决

    安装某应用,运行提示: 应用程序无法正常启动(0xc0000135) 应该是缺少 .net framework. 控制面板-程序-"启用或关闭windows功能" 勾选.NET F ...

  9. [日常摸鱼]bzoj4802 欧拉函数-PollardRho大整数分解算法

    啊居然要特判,卡了好久QAQ (好像Windows下的rand和Linux下的不一样? QwQ一些东西参考了喵铃的这篇blog:http://www.cnblogs.com/meowww/p/6400 ...

  10. matplotlib的学习2-基本用法

    import matplotlib.pyplot as plt import numpy as np x = np.linspace(-1, 1, 50)#范围-1 到 1,个数是50 y = 2*x ...