参考《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

最新文章

  1. [家里蹲大学数学杂志]第053期Legendre变换
  2. asp.net 的page 基类页面 做一些判断 可以定义一个基类页面 继承Page类 然后重写OnPreLoad事件
  3. using-ef-code-first-with-an-existing-database
  4. WCF 遇到的问题
  5. swift2.0 Cannot assign a value of type &#39;[CFString]&#39; to a value of type &#39;[String]&#39;
  6. ASP.NET单点登录(代码)
  7. Java中实现线程的方法
  8. java MongoDB driver error infos
  9. IOS 上线问题
  10. tp框架知识 之(链接数据库和操作数据)
  11. window7使用svn(svn系列 客户端 知识二总结)
  12. 【卸载】oracle卸载
  13. MyBatis3入门
  14. Android studio 1.x 安装完毕后无法打开问题解决方案
  15. C# XmlDocument操作XML
  16. PAT乙级--1003
  17. Person Transfer GAN to Bridge Domain Gap for Person Re-identification
  18. git 命令提交项目到github
  19. K8s简单yaml文件运行例子deployment
  20. 【Thread】CountdownEvent任务并行[z]

热门文章

  1. python学习第四天-函数
  2. hdu3555 Bomb(数位dp)
  3. js常用转义字符列表
  4. JS事件循环(Event Loop)机制
  5. 最新版WinRAR5.61去广告代码教程分享(仅供学习交流)
  6. Java网络编程:IP地址和端口号
  7. Win7 VS2012智能提示显示英文的处理办法
  8. 基于CentOS 7.3 安装Ceph Jewel 10.2.9
  9. SpringBoot搭建基于Apache Shiro+Redis的分布式Session共享功能
  10. AcWing 232. 守卫者的挑战 (期望DP)打卡