Java 多线程 (PART XIX) 使用Condition实现线程的顺序执行
来源:互联网 发布:hiddns域名注册 编辑:程序博客网 时间:2024/06/01 19:43
join的实现
前面介绍了,如何使用jion方法实现线程的顺序执行。
http://blog.csdn.net/uncle_gy/article/details/78163215
condition的实现
package condition123;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Main { volatile private static int nextPrintWho = 1; volatile private static Lock lock = new ReentrantLock(); final private static Condition condition= lock.newCondition(); public static void main(String[] args) { Thread threadA = new Thread() { public void run() { try { lock.lock(); while (nextPrintWho != 1) { condition.await(); } for (int i = 0; i < 3; i++) { System.out.println("ThreadA " + (i + 1)); } nextPrintWho = 2; condition.signalAll(); } catch (InterruptedException e) { } finally { lock.unlock(); } } }; Thread threadB = new Thread() { public void run() { try { lock.lock(); while (nextPrintWho != 2) { condition.await(); } for (int i = 0; i < 3; i++) { System.out.println("ThreadB " + (i + 1)); } nextPrintWho = 3; condition.signalAll(); } catch (InterruptedException e) { } finally { lock.unlock(); } } }; Thread threadC = new Thread() { public void run() { try { lock.lock(); while (nextPrintWho != 3) { condition.await(); } for (int i = 0; i < 3; i++) { System.out.println("ThreadC " + (i + 1)); } nextPrintWho = 1; condition.signalAll(); } catch (InterruptedException e) { } 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(); } }}
输出结果:
ThreadA 1ThreadA 2ThreadA 3ThreadB 1ThreadB 2ThreadB 3ThreadC 1ThreadC 2ThreadC 3ThreadA 1ThreadA 2ThreadA 3ThreadB 1ThreadB 2ThreadB 3ThreadC 1ThreadC 2ThreadC 3ThreadA 1ThreadA 2ThreadA 3ThreadB 1ThreadB 2ThreadB 3ThreadC 1ThreadC 2ThreadC 3ThreadA 1ThreadA 2ThreadA 3ThreadB 1ThreadB 2ThreadB 3ThreadC 1ThreadC 2ThreadC 3ThreadA 1ThreadA 2ThreadA 3ThreadB 1ThreadB 2ThreadB 3ThreadC 1ThreadC 2ThreadC 3
使用nextwhoPrint来控制下一个打印的线程是谁。每次使用condition.signalAll();来唤醒所有线程,每个线程都检查nextwhoPrint是不是自己的量,如果不是则再次condition.await();不过这里的ABC线程并不保证是同一个循环里的ABC,但是每个A和A之间是同步的。
阅读全文
0 0
- Java 多线程 (PART XIX) 使用Condition实现线程的顺序执行
- Java 多线程 (PART VII) 使用join()方法保证线程的执行顺序
- 使用condition实现顺序执行线程
- JAVA多线程顺序执行(使用join,lock,condition,信号量)原理和java源代码
- condition实现三个线程顺序执行《2》
- 三个线程轮流执行顺序打印ABC(二):使用Lock+Condition实现
- Java并发(九)Condition和线程顺序执行
- Condition的使用,实现三个线程互斥执行。
- java使用CountDownLatch实现线程顺序执行
- JAVA多线程---Condition使用---线程通信
- java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
- Java多线程与并发应用-(11)-用Lock+Condition实现1,2,3 三个模块按顺序执行。
- java 多线程控制线程执行顺序
- Java多线程之Condition接口的实现
- Java多线程之Condition接口的实现
- Java多线程之Condition接口的实现
- JAVA多线程-Lock的使用(一)-ReentrantLock与Condition
- Java多线程 之 lock与condition的使用(十四)
- mysql 实现行号的方法——如何获取当前记录所在行号
- 反射--获取和调用构造器
- Ubuntu下Laravel的开发环境安装及部署(Vagrant + Homestead)
- DB2 with的定义与用法
- HTML动画滑动图片特效
- Java 多线程 (PART XIX) 使用Condition实现线程的顺序执行
- Course 2-Improving Deep Neural Networks--Week 3
- 文章标题
- Itext7的字体导入
- 最牛干货 就问你敢不敢“看”
- 苹果首席设计师:iPhone X 耗时五年,设计要等技术赶上
- C# 正则表达式
- 如何学习自然语言处理:一本书和一门课
- 第四周项目 项目5