Thread--使用condition实现顺序执行
package condition; import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock; import threadLocalTest2.ThreadA; public class Run { private static volatile int nextPrintWho = 1;
private static ReentrantLock lock = new ReentrantLock();
private static final Condition conditionA = lock.newCondition();
private static final Condition conditionB = lock.newCondition();
private static final Condition conditionC = lock.newCondition(); public static void main(String[] args) {
Thread threadA = new Thread() { @Override
public void 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) {
// TODO Auto-generated catch block
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) {
// TODO Auto-generated catch block
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) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
} };
for(int i=0; i<5; i++) {
new Thread(threadA).start();
new Thread(threadB).start();
new Thread(threadC).start();
}
} }
Thread--使用condition实现顺序执行的更多相关文章
- 使用Condition实现顺序执行
参考<Java多线程编程核心技术> 使用Condition对象可以对线程执行的业务进行排序规划 具体实现代码 public class Run2 { private static Reen ...
- [Thread] 多线程顺序执行
Join 主线程join 启动线程t1,随后调用join,main线程需要等t1线程执行完毕后继续执行. public class MainJoin { static class MyThread i ...
- jmeter Thread Groups的顺序执行与并行执行
本期目标: 理解Thread Groups的顺序执行与并行执行 控制因子:Run Thread Groups consecutively(i.e.one at time) 预期结论: 1.勾选 Run ...
- 使用condition 实现线程顺序执行
书上给的例子都是ABCABC这种,比较简单,复杂点的如A0B0C0, A0A1A2没有,手动实现下,做个记录 1. A0 A1 A2 A3 public class Demo0 { private s ...
- Java中如何保证线程顺序执行
只要了解过多线程,我们就知道线程开始的顺序跟执行的顺序是不一样的.如果只是创建三个线程然后执行,最后的执行顺序是不可预期的.这是因为在创建完线程之后,线程执行的开始时间取决于CPU何时分配时间片,线程 ...
- C#之使用AutoResetEvent实现线程的顺序执行
前几天一朋友问我如何实现线程的顺序执行,说真的,虽然看过CLR这本书,也把线程部分拜读了两遍,但是这个问题出来之后还是没有一个思路.今天在搜索资料的时候无意中再次看到AutoResetEvent这个东 ...
- Java中线程顺序执行
现有线程threadone.threadtwo和threadthree,想要的运行顺序为threadone->threadtwo->threadthree,应该如何处理?这里需要用到一个简 ...
- AsyncTask delay延迟执行 或者顺序执行 问题
惯用AsyncTask的朋友可能会发现AsyncTask的坑: Android executes AsyncTask tasks before Android 1.6 and again as of ...
- Android中让多个线程顺序执行探究
线程调度是指按照特定机制为多个线程分配CPU的使用权. 有两种调度模型:分时调度模型和抢占式调度模型. 分时调度模型:是指让所有的线程轮流获得cpu的使用权,并且平均分配每个线程占用的CPU的时间片. ...
随机推荐
- Git TortoiseGit github 操作
由于公司采用了分布式架构,选择的是gitlab git 来管理代码等工作,鉴于github和gitlab的相似性,网上查看好多都是用git的命令上传,或者是一部分,为此,借鉴多方网络,并进行实际操作, ...
- 利用vim查看日志,快速定位问题《转载》
利用vim查看日志,快速定位问题 链接:https://www.cnblogs.com/abcwt112/p/5192944.html
- ORA-22813 ORA-06512
ORA-22813:操作数值超出系统限制. 原因: 对象或集合值太大.SORT上下文中值的大小可能超过30k,或者可用内存的大小可能太大. 操作: 选择其他值并重试该操作. ORA-06512错 ...
- 九十六、SAP中ALV事件之九,显示功能按钮栏中显示ALV加强工具栏
一.排查了很久,终于找到问题所在.把问题解决了,代码如下: 二.运行效果如下 三.试一试,标准功能都可以用 完美
- JAVA - Intellij IDEA 中去掉mybatis Mapper.xml背景色
JAVA - Intellij IDEA 中去掉mybatis Mapper.xml背景色 1:现在公司中使用mybatis的频率非常高,一般都会用MBG来生成基础的代码文件.在intellij中查看 ...
- 这篇干货让你在零点前完成学术Essay写作
写论文,做研究,上课,参加课外活动,与他人social...在美国,你会有很多的事情需要你去做,如何将自己的时间平衡的分配到自己的学习生活以及私人生活中,就显得尤为重要,而这些问题也是影响中国学生的重 ...
- Ubuntu 安装phpmyadmin (9.17第六天)
PhpMyAdmin 是一个用 PHP 编写的软件工具,可以通过 web方式控制和操作 MySQL 数据库.通过 phpMyAdmin 可以完全对数据库进行操作,例如建立.复制和删除数据等等,这样 M ...
- 如何创建NPM包并上传
1 在NPM网站上注册,并验证(verify)自己的邮箱 https://www.npmjs.com 2 用命令行定位到你的库文件夹 3 在命令行里登录npm, 按提示依次输入用户名 密码 注册邮箱 ...
- Java算法练习——整数反转
题目链接 题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 备注 注意: 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 $[−2^{31}, 2^ ...
- cf 755D. PolandBall and Polygon
题意:把一个多边形往里面连对角线,然后问每次添加多边形被划分为几个部分 产生的部分就是新加对角线与原有对角线相交条数+1,用线段树(大雾)维护一下. #include<bits/stdc++.h ...