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. 区间DP复习

    区间DP复习 (难度排序:(A,B),(F,G,E,D,H,I,K),(C),(J,L)) 这是一个基本全在bzoj上的复习专题 没有什么可以说的,都是一些基本的dp思想 A [BZOJ1996] [ ...

  2. 《jmeter接口自动化与性能实战-飞天小子.pdf》

    Jmeter作为开源测试工具,以其轻便,功能齐全的优点,正越来越受到企业的重视.作为纯java的工具,它的扩展性无比强大,既可以做功能测试,也可以做性能测试:既支持接口层面的测试,也支持webdriv ...

  3. GC(一)内存管理与垃圾回收

    参考文章: 内存分配.GC原理与垃圾收集器:http://www.importnew.com/23035.html g1垃圾回收器:http://blog.jobbole.com/109170/ cm ...

  4. NIOBuffer 缓冲区

    Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但是,Channel,Buffer 和 Select ...

  5. BERT模型

    BERT模型是什么 BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder,因为de ...

  6. Ubuntu 安装最新版 (1.12) Golang 并使用 go mod

    wget https://dl.google.com/go/go1.12.4.linux-amd64.tar.gz sudo tar -zxvf go1.12.4.linux-amd64.tar.gz ...

  7. (转)Loadrunner教程--常用操做流程

    1loadrunner压力测试一般使用流程 1.1loadrunner压力测试原理 本质就是在loadrunner上模拟多个用户同时按固定行为访问web站点.其中固定行为在loadrunner中是通过 ...

  8. Scrapy的 Shell终端

    crapy Shell Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查看他们的工作方式,方便我们爬取的网页中提取的数据. ...

  9. setDefaultDllDirectories无法定位动态链接库kernel32.dll

    参考链接 : https://blog.csdn.net/gdali/article/details/93084828 https://tieba.baidu.com/p/5795675519?red ...

  10. ospf的路由更新和撤销总结

    首先ospf 的报文有:hello报文,主要作用ospf 邻居建立及维护.dd报文,主要作用主从选举,序列号主从的确认,mtu的协商(可选).lsr 报文,主要作用向邻居请求lsa.lsu报文,主要作 ...