博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JDK提供的并发工具类
阅读量:4495 次
发布时间:2019-06-08

本文共 4131 字,大约阅读时间需要 13 分钟。

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

转载于:https://www.cnblogs.com/charlypage/p/10897554.html

你可能感兴趣的文章
Luogu P2467 [SDOI2010]地精部落 | 神奇的dp
查看>>
不可变类小结
查看>>
syslog-ng应用详解
查看>>
关于类加载器
查看>>
XCode: duplicate symbol 解决方案
查看>>
iOS状态栏设置详解!
查看>>
编程习惯1
查看>>
【读书笔记】iOS-给模拟器相册增加图片
查看>>
【Silverlight实例】Silverlight与Access数据库的互操作
查看>>
Java实现AES加密,异常java.security.InvalidKeyException: Illegal key size 的解决
查看>>
ActionMapping、ActionForward笔记
查看>>
带你入门机器学习
查看>>
fragment 重叠问题
查看>>
三层架构,四层模型
查看>>
[HAOI2008]硬币购物
查看>>
纯C语言跑分(详细注释)
查看>>
.Net分布式架构(一):Nginx实现负载均衡
查看>>
POJ 2485 Highways(最小生成树Prim算法)
查看>>
文本界面听歌神器--moc
查看>>
Ubuntu上安装谷歌第二代机器学习系统TensorFlow
查看>>