使用Condition实现顺序执行
2024-09-06 02:06:55
参考《Java多线程编程核心技术》
使用Condition对象可以对线程执行的业务进行排序规划
具体实现代码
public class Run2 {
private static ReentrantLock lock = new ReentrantLock();
private final static Condition conditionA = lock.newCondition();
private final static Condition conditionB = lock.newCondition();
private final static Condition conditionC = lock.newCondition();
private volatile static int nextPrintWho = 1;
public static void main(String[] args){
Thread threadA = new Thread(){
@Override
public void run() {
super.run();
try {
lock.lock();
while (nextPrintWho != 1){
conditionA.await();
}
for (int i = 0; i < 3; i++) {
System.out.println("ThreadA "+ (i+1));
}
nextPrintWho = 2;
conditionB.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}; Thread threadB = new Thread(){
@Override
public void run() {
try {
lock.lock();
while (nextPrintWho !=2){
conditionB.await();
}
for (int i = 0; i < 3; i++) {
System.out.println("ThreadB "+(i+1));
}
nextPrintWho = 3;
conditionC.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}; Thread threadC = new Thread(){
@Override
public void run() {
try {
lock.lock();
while (nextPrintWho != 3){
conditionC.await();
}
for (int i = 0; i < 3; i++) {
System.out.println("ThreadC "+(i+1));
}
nextPrintWho = 1;
conditionA.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}; Thread[] aArray = new Thread[5];
Thread[] bArray = new Thread[5];
Thread[] cArray = new Thread[5]; for (int i = 0; i < 5; i++) {
aArray[i] = new Thread(threadA);
bArray[i] = new Thread(threadB);
cArray[i] = new Thread(threadC); aArray[i].start();
bArray[i].start();
cArray[i].start();
}
}
}
-----------------------------------------------console---------------------------------------------------
ThreadA 1
ThreadA 2
ThreadA 3
ThreadB 1
ThreadB 2
ThreadB 3
ThreadC 1
ThreadC 2
ThreadC 3
ThreadA 1
ThreadA 2
ThreadA 3
ThreadB 1
ThreadB 2
ThreadB 3
ThreadC 1
ThreadC 2
ThreadC 3
ThreadA 1
ThreadA 2
ThreadA 3
ThreadB 1
ThreadB 2
ThreadB 3
ThreadC 1
ThreadC 2
ThreadC 3
ThreadA 1
ThreadA 2
ThreadA 3
ThreadB 1
ThreadB 2
ThreadB 3
ThreadC 1
ThreadC 2
ThreadC 3
ThreadA 1
ThreadA 2
ThreadA 3
ThreadB 1
ThreadB 2
ThreadB 3
ThreadC 1
ThreadC 2
ThreadC 3
最新文章
- [家里蹲大学数学杂志]第053期Legendre变换
- asp.net 的page 基类页面 做一些判断 可以定义一个基类页面 继承Page类 然后重写OnPreLoad事件
- using-ef-code-first-with-an-existing-database
- WCF 遇到的问题
- swift2.0 Cannot assign a value of type &#39;[CFString]&#39; to a value of type &#39;[String]&#39;
- ASP.NET单点登录(代码)
- Java中实现线程的方法
- java MongoDB driver error infos
- IOS 上线问题
- tp框架知识 之(链接数据库和操作数据)
- window7使用svn(svn系列 客户端 知识二总结)
- 【卸载】oracle卸载
- MyBatis3入门
- Android studio 1.x 安装完毕后无法打开问题解决方案
- C# XmlDocument操作XML
- PAT乙级--1003
- Person Transfer GAN to Bridge Domain Gap for Person Re-identification
- git 命令提交项目到github
- K8s简单yaml文件运行例子deployment
- 【Thread】CountdownEvent任务并行[z]
热门文章
- python学习第四天-函数
- hdu3555 Bomb(数位dp)
- js常用转义字符列表
- JS事件循环(Event Loop)机制
- 最新版WinRAR5.61去广告代码教程分享(仅供学习交流)
- Java网络编程:IP地址和端口号
- Win7 VS2012智能提示显示英文的处理办法
- 基于CentOS 7.3 安装Ceph Jewel 10.2.9
- SpringBoot搭建基于Apache Shiro+Redis的分布式Session共享功能
- AcWing 232. 守卫者的挑战 (期望DP)打卡