CountDownLatch(计数器)

主线程等待另外三个线程执行完成后再执行

public static void main(String[] args) {
//定义一个CountDownLatch
CountDownLatch countDownLatch = new CountDownLatch(3);
// 主线程等待另外三个线程执行完成后再执行
new Thread(() -> {
try {
System.out.println("开始执行01");
Thread.sleep(3000);
System.out.println("执行完成01");
countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start(); new Thread(() -> {
try {
System.out.println("开始执行02");
Thread.sleep(3000);
System.out.println("执行完成02");
countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start(); new Thread(() -> {
try {
System.out.println("开始执行03");
Thread.sleep(3000);
System.out.println("执行完成03");
countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start(); try {
System.out.println("等待3个线程执行完毕。。。");
countDownLatch.await();
System.out.println("主线程开始执行");
} catch (InterruptedException e) {
e.printStackTrace();
}
}

CyclicBarrier(回环栅栏)

三个线程互相等待await执行完成后继续执行

public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(3); // 三个线程互相等待await执行完成后继续执行
new Thread(() -> {
try {
System.out.println("开始执行01");
Thread.sleep(3000);
System.out.println("执行完成01");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"所有线程执行完毕,继续处理其他任务...");
}).start(); new Thread(() -> {
try {
System.out.println("开始执行02");
Thread.sleep(3000);
System.out.println("执行完成02");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"所有线程执行完毕,继续处理其他任务...");
}).start(); new Thread(() -> {
try {
System.out.println("开始执行03");
Thread.sleep(3000);
System.out.println("执行完成03");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"所有线程执行完毕,继续处理其他任务...");
}).start(); }

Semaphore(信号量)

8个工人使用5台机器

public class Test {
public static void main(String[] args) {
int N = 8; //工人数
Semaphore semaphore = new Semaphore(5); //机器数目
for(int i=0;i<N;i++)
new Worker(i,semaphore).start();
} static class Worker extends Thread{
private int num;
private Semaphore semaphore;
public Worker(int num,Semaphore semaphore){
this.num = num;
this.semaphore = semaphore;
} @Override
public void run() {
try {
semaphore.acquire();
System.out.println("工人"+this.num+"占用一个机器在生产...");
Thread.sleep(2000);
System.out.println("工人"+this.num+"释放出机器");
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

总结

  • CountDownLatch用作某个线程等待其他的线程执行完成后,它才执行。
  • CyclicBarrier用作一组线程等待到某个状态,然后这组线程才继续执行。
  • CountDownLatch是不能够重用的,而CyclicBarrier是可以重用的。
  • Semaphore类似于锁,对资源访问权限控制。

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. MQTT 协议学习:000-有关概念入门

    背景 从本章开始,在没有特殊说明的情况下,文章中的MQTT版本均为 3.1.1. MQTT 协议是物联网中常见的协议之一,"轻量级物联网消息推送协议",MQTT同HTTP属于第七层 ...

  2. git使用问题二删除远程仓库文件,本地保留不动

    git rm --cached filename/-r directory git commit "xxxx" git push

  3. firewalld学习--service的使用和配置

    service配置文件 firewalld默认给我们提供的ftp的service配置文件ftp.xml <?xml version="1.0" encoding=" ...

  4. 第2节 网站点击流项目(下):7、hive的级联求和

    一.hive级联求和的简单例子: create table t_salary_detail(username string,month string,salary int)row format del ...

  5. 洛谷 P2031 脑力达人之分割字串

    题目传送门 解题思路: f[i]表示到第i位可获得的最大分割次数,对于每个f[i]都可由其符合条件的前缀转移过来,条件就是当前串除了前缀的剩余字符里有所给单词,然后一看,这不是在剩余字符里找有没有所给 ...

  6. C++中数字与字符串之间的转换 scanf string总结(复习必读)

    1 string的scanf读入操作 C++里面控制台输入直接使用cin操作就可以了:或者getline(istringstream,string); 字符和数字加减就是字符的ASCII码和数字直接加 ...

  7. mysql导入导出无权限

    error:The MySQL server is running with the --secure-file-priv option so it cannot execute this state ...

  8. 强大的promise

    这个玩意叫做普罗米修斯,希腊神话的盗火英雄 promise只用来包装异步函数,同步的会搞乱执行顺序,生产BUG // 如何使用 function pro(){ return new Promise(f ...

  9. System.Reflection.ReflectionTypeLoadException

    引用了一个第三方dll, 此dll经过混淆,但是未签名. 然后,主程序无法反射了, 取消主程序的签名后正常反射.

  10. javascript中call与this的初见

    call定义 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明:call 方法可以用来代替另一 ...