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. 第08组 Alpha冲刺(3/6)

    队名:955 组长博客:https://www.cnblogs.com/cclong/p/11872693.html 作业博客:https://edu.cnblogs.com/campus/fzu/S ...

  2. 保存tensor至本地文件

    path_temp = '../m39_data/temp3' #文件目录 file_name = os.path.join(path_temp, "setQ.txt") Q = ...

  3. Eclipse 远程开发插件 RSE 及远程登录

    Eclispe 使用私钥登录远程服务器 生成私钥 Window --> Preference --> SSH2 --> Key Management --> Generate ...

  4. xargs 命令教程

    转自阮一峰 http://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html 仅供个人交流学习 xargs是 Unix 系统的一个很有用的命令,但是 ...

  5. go - helloword

    package mainimport "fmt" //一定要双引号func main() {/* test hello word *///test fmt.Println(&quo ...

  6. 冰多多团队-第三次Scrum会议

    冰多多团队-第三次Scrum会议 会议基本情况 会议时间:4月9日 21:30 - 21:45 会议地点:新主楼F座2楼沙发休息处 工作情况 团队成员 已完成任务 待完成任务 zpj 接入Action ...

  7. vs code搭建python和tensorflow环境

    anaconda 安装tensorflow-gpu环境见https://www.cnblogs.com/wintersoft/p/11620267.html vscode中设置python虚拟环境Ct ...

  8. IIS 7中添加匿名访问FTP站点

    1. 开启FTP和IIS服务: 2.打开IIS 管理器: 我电脑上是IIS 7.5 ,所以选择第一个并点击打开哦. 如果你想知道自己IIS的版本,打开帮助菜单: 3. 新建FTP站点: 4. 填写站点 ...

  9. CentOS7下将Python的版本升级为3.7

    众所周知,在2020年python官方将不再支持2.7版本的python,所以使用3.x版本的python是必要的,但是linux中默认安装的python一般是2.6和2.7版本的,要是使用linux ...

  10. Window 如何整理并删除无用的电脑文件 --不错的

    重复文件查找:https://download.csdn.net/download/rerere__rereredd/9745723   Duplicate Cleaner Pro 4.0.4中英文多 ...