1.CountDownLatch

await(),进入等待的状态

countDown(),计数器减一

应用场景:启动三个线程计算,需要对结果进行累加。

/**
*
* CountDownLatch Demo
*
*/
public class CountDownLatchDemo { public static void main(String[] args) { CountDownLatch countDownLatch = new CountDownLatch(8);
new Thread(()->{ try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("800米比赛结束,准备清空跑道并继续跨栏比赛");
}).start(); for (int i = 0; i < 8; i++) { final int finalI = i;
// System.out.println("fin->"+finalI);
new Thread(()->{ try {
Thread.sleep(finalI * 1000L);
System.out.println(Thread.currentThread().getName()+"到达终点了");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
countDownLatch.countDown();
}
}).start();
}
}
}

2.CyclicBarrier--栅栏

允许一组线程相互等待达到一个公共的障碍点,之后再继续执行

跟countDownLatch的区别

CountDownLatch一般用于某个线程等待若干个其他线程执行完任务之后,它才执行;不可重复使用

CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;可重用的

/**
* 栅栏系统
*/
public class CyclicBarrierDemo { public static void main(String[] args) { CyclicBarrier cyclicBarrier = new CyclicBarrier(8); for (int i = 0; i < 8; i++) { int finalI = i;
new Thread(()->{
try {
Thread.sleep(finalI *1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"准备就绪"); try { cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
} System.out.println("开始比赛");
}).start(); }
} }

3.Semaphore--信号量

控制并发数量

使用场景:接口限流

/**
* Semaphore
* 控制进来的最多的线程数量 等释放后才允许后续的进来
*/
public class SemaphoreDemo { public static void main(String[] args) { Semaphore semaphore = new Semaphore(8); for (int i = 0; i < 10; i++) {
new Thread(()->{ try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName()+"开始执行");
Thread.sleep(5000L);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
//最后需要释放
semaphore.release();
} }).start();
}
}
}

4.Exchanger

用于交换数据

它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据,

如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点

时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。因此使用Exchanger的重点是成对的

线程使用exchange()方法,当有一对线程达到了同步点,就会进行交换数据。因此该工具类的线程对象是【成

对】的。

/**
* Exchanger 线程间的数据交换
* 交换线程数量必须成对
*
*/
public class ExchangerDemo { public static void main(String[] args) { Exchanger<String> stringExchanger = new Exchanger<>(); String str1 = "str001";
String str2 = "str002"; new Thread(()->{ System.out.println(Thread.currentThread().getName()
+"初始化的数据==>"+str1
);
try {
//开始交换数据
String exchange = stringExchanger.exchange(str1);
System.out.println(Thread.currentThread().getName()
+"交换后的数据==>"+exchange
);
} catch (InterruptedException e) {
e.printStackTrace();
} },"线程1").start(); new Thread(()->{ System.out.println(Thread.currentThread().getName()
+"初始化的数据==>"+str2
);
try {
//开始交换数据
String exchange = stringExchanger.exchange(str2);
System.out.println(Thread.currentThread().getName()
+"交换后的数据==>"+exchange
);
} catch (InterruptedException e) {
e.printStackTrace();
} },"线程2").start(); } }

JDK提供的并发工具类的更多相关文章

  1. java并发学习--第七章 JDK提供的线程工具类

    一.ThreadLocal ThreadLocal类用于隔离多线程中使用的对象,为ThreadLocal类中传递的泛型就是要隔离的对象,简单的来说:如果我们在主线程创建了一个对象,并且需要给下面的多线 ...

  2. JDK并发工具类

    在JDK的并发包里提供了几个非常有用的并发工具类.CountDownLatch.CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类则提供了在线程 ...

  3. 并发工具类:CountDownLatch、CyclicBarrier、Semaphore

    在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch ...

  4. java中的并发工具类

    在jdk的并发包里提供了几个非常有用的并发工具类.CountDownLatdch.CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类则提供了在线 ...

  5. Java中的并发工具类(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)

    在JDK的并发包里提供了很多有意思的并发工具类.CountDownLatch.CyclicBarrier和Semaphore 工具类提供了一种并发流程控制的手段,Exchanger 工具类则提供了在线 ...

  6. Java并发编程-并发工具类及线程池

    JUC中提供了几个比较常用的并发工具类,比如CountDownLatch.CyclicBarrier.Semaphore. CountDownLatch: countdownlatch是一个同步工具类 ...

  7. 并发工具类(一)等待多线程的CountDownLatch

    前言   JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ...

  8. 并发工具类(二)同步屏障CyclicBarrier

    前言   JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ...

  9. 并发工具类(三)控制并发线程的数量 Semphore

    前言   JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ...

随机推荐

  1. GoCN每日新闻(2019-11-02)

    GoCN每日新闻(2019-11-02) GoCN每日新闻(2019-11-02) 1. Go 1.13.4 and Go 1.12.13 are released https://groups.go ...

  2. ansible-playbook-批量修改主机名

    修改cat /etc/ansible/hosts [test]10.27.235.108 host_name=test_host_name - hosts: test user: root gathe ...

  3. JPA连接PG数据库时间类型查询报错的修改

    PG数据库中的时间格式规范: https://blog.csdn.net/sky_limitless/article/details/79527665 to_data 转换为 普通的时间格式 to_t ...

  4. MongoDB笔记: 分片集群

    MongoDB分片集群由三个模块组成 shard: 分片(或者分区)模块, 每个分片分别存储一部分数据, 从MongoDB 3.6开始, 分片必须是replica set(副本集) mongos: m ...

  5. Java13新特性 -- ZGC:取消使用未使用的内存

    在JDK 11中,Java引入了ZGC,这是一款可伸缩的低延迟垃圾收集器,但是当时只是实验性的.号称不管你开了多大的堆内存,它都能保证在 10 毫秒内释放 JVM ,不让它停顿在那.但是,当时的设计是 ...

  6. 研发团队是该制定OKR还是KPI?

    绩效管理和OKR的目标管理,是前行的两条腿,缺谁都会寸步难行.正确的做法是把企业的使命和任务,转化为经营目标,然后再用KPI.OKR等绩效管理工具,分解.执行.考核.. KPI是一套绩效管理的方法.全 ...

  7. 在 Windows 中配置Maven

    访问http://maven.apache.org/ 点击左侧的导航栏,Download 跳转到下载maven的页面,往下滚动,看到 Files 处,选择apache-maven-3.3.9-bin- ...

  8. openlive writer 汉化方法

    使用方法: 替换你安装openlive writer 位置C:\Users\Administrator\AppData\Local\OpenLiveWriter的 app目录 下的 OpenLiveW ...

  9. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器开放平台利用 webpack 打包压缩后端代码

    需求背景 javaScript的用途是解决页面交互和数据交互,最终目的是丰富客户端效果以及数据的有效传递. 并且具有良好的用户体验. javaScript可以快速实现页面交互,即js操作html的do ...

  10. [ARM-Linux开发] 主设备号--驱动模块与设备节点联系的纽带

    一.如何对设备操作 linux中对设备进行操作是通过文件的方式进行的,包括open.read.write.对于设备文件,一般称其为设备节点,节点有一个属性是设备号(主设备号.次设备号),其中主设备号将 ...