1. package condition;
  2.  
  3. import java.util.concurrent.locks.Condition;
  4. import java.util.concurrent.locks.ReentrantLock;
  5.  
  6. import threadLocalTest2.ThreadA;
  7.  
  8. public class Run {
  9.  
  10. private static volatile int nextPrintWho = 1;
  11. private static ReentrantLock lock = new ReentrantLock();
  12. private static final Condition conditionA = lock.newCondition();
  13. private static final Condition conditionB = lock.newCondition();
  14. private static final Condition conditionC = lock.newCondition();
  15.  
  16. public static void main(String[] args) {
  17. Thread threadA = new Thread() {
  18.  
  19. @Override
  20. public void run() {
  21. try {
  22. lock.lock();
  23. while(nextPrintWho != 1) {
  24. conditionA.await();
  25. }
  26. for(int i=0; i<3; i++) {
  27. System.out.println("ThreadA " + (i+1));
  28. }
  29. nextPrintWho = 2;
  30. conditionB.signalAll();
  31. } catch (InterruptedException e) {
  32. // TODO Auto-generated catch block
  33. e.printStackTrace();
  34. } finally {
  35. lock.unlock();
  36. }
  37. }
  38.  
  39. };
  40. Thread threadB = new Thread() {
  41.  
  42. @Override
  43. public void run() {
  44. try {
  45. lock.lock();
  46. while(nextPrintWho != 2) {
  47. conditionB.await();
  48. }
  49. for(int i=0; i<3; i++) {
  50. System.out.println("ThreadB " + (i+1));
  51. }
  52. nextPrintWho = 3;
  53. conditionC.signalAll();
  54. } catch (InterruptedException e) {
  55. // TODO Auto-generated catch block
  56. e.printStackTrace();
  57. } finally {
  58. lock.unlock();
  59. }
  60. }
  61.  
  62. };
  63. Thread threadC = new Thread() {
  64.  
  65. @Override
  66. public void run() {
  67. try {
  68. lock.lock();
  69. while(nextPrintWho != 3) {
  70. conditionC.await();
  71. }
  72. for(int i=0; i<3; i++) {
  73. System.out.println("ThreadC " + (i+1));
  74. }
  75. nextPrintWho = 1;
  76. conditionA.signalAll();
  77. } catch (InterruptedException e) {
  78. // TODO Auto-generated catch block
  79. e.printStackTrace();
  80. } finally {
  81. lock.unlock();
  82. }
  83. }
  84.  
  85. };
  86. for(int i=0; i<5; i++) {
  87. new Thread(threadA).start();
  88. new Thread(threadB).start();
  89. new Thread(threadC).start();
  90. }
  91. }
  92.  
  93. }

Thread--使用condition实现顺序执行的更多相关文章

  1. 使用Condition实现顺序执行

    参考<Java多线程编程核心技术> 使用Condition对象可以对线程执行的业务进行排序规划 具体实现代码 public class Run2 { private static Reen ...

  2. [Thread] 多线程顺序执行

    Join 主线程join 启动线程t1,随后调用join,main线程需要等t1线程执行完毕后继续执行. public class MainJoin { static class MyThread i ...

  3. jmeter Thread Groups的顺序执行与并行执行

    本期目标: 理解Thread Groups的顺序执行与并行执行 控制因子:Run Thread Groups consecutively(i.e.one at time) 预期结论: 1.勾选 Run ...

  4. 使用condition 实现线程顺序执行

    书上给的例子都是ABCABC这种,比较简单,复杂点的如A0B0C0, A0A1A2没有,手动实现下,做个记录 1. A0 A1 A2 A3 public class Demo0 { private s ...

  5. Java中如何保证线程顺序执行

    只要了解过多线程,我们就知道线程开始的顺序跟执行的顺序是不一样的.如果只是创建三个线程然后执行,最后的执行顺序是不可预期的.这是因为在创建完线程之后,线程执行的开始时间取决于CPU何时分配时间片,线程 ...

  6. C#之使用AutoResetEvent实现线程的顺序执行

    前几天一朋友问我如何实现线程的顺序执行,说真的,虽然看过CLR这本书,也把线程部分拜读了两遍,但是这个问题出来之后还是没有一个思路.今天在搜索资料的时候无意中再次看到AutoResetEvent这个东 ...

  7. Java中线程顺序执行

    现有线程threadone.threadtwo和threadthree,想要的运行顺序为threadone->threadtwo->threadthree,应该如何处理?这里需要用到一个简 ...

  8. AsyncTask delay延迟执行 或者顺序执行 问题

    惯用AsyncTask的朋友可能会发现AsyncTask的坑: Android executes AsyncTask tasks before Android 1.6 and again as of ...

  9. Android中让多个线程顺序执行探究

    线程调度是指按照特定机制为多个线程分配CPU的使用权. 有两种调度模型:分时调度模型和抢占式调度模型. 分时调度模型:是指让所有的线程轮流获得cpu的使用权,并且平均分配每个线程占用的CPU的时间片. ...

随机推荐

  1. Golang的循环结构-for语句

    Golang的循环结构-for语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.for循环语法 循环结构在生活中的场景也非常的多,比如: ()上班族们每天朝九晚五的生活; ( ...

  2. Python3中的bytes和str类型

    Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str和b ...

  3. bzoj 2796: [Poi2012]Fibonacci Representation

    结论貌似是,,,肯定只有没有重复的数字.http://hzwer.com/6426.html 一开始猜的是贪心,感觉也是可以的啊...(想想都有道理,然而看到是神奇的(dp类)记忆化搜索,直接虚的不敢 ...

  4. Gauss列主消元

    问题:1.列主消元为什么精度高? 2.fabs函数精确度 #include<iostream> #include<cstdio> #include<cstring> ...

  5. Codeforces Round #616 (Div. 2) 题解

    A. Even But Not Even 题意: 定义一个数所有位置的和为偶数它本身不为偶数的数为ebne,现在给你一个数字字符串,你可以删除任意位置上的数字使其变为ebne输出任意改变后的结果,如果 ...

  6. 六十七、SAP中内表插入的三种方法之一,APPEND的使用

    一.如果内表是一个普通的内表,只用于存储数据不用来排序,那么优先选择APPEND插入 二.我们运行程序,并把工作区和内表加入到断点变量,如图所示,1X22的意思如图 三.我们点击ITAB1,来看内表数 ...

  7. ES6 之 对象属性的可枚举性和遍历

    1.Object.getOwnPropertyDescriptor() 解释:获取对对象属性的描述对象. let obj = { foo: 123 }; console.log(Object.getO ...

  8. 吴裕雄--天生自然C++语言学习笔记:C++ 字符串

    C++ 提供了以下两种类型的字符串表示形式: C 风格字符串 C++ 引入的 string 类类型 C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持.字符串实际上是使用 null 字符 ...

  9. SpringBoot的Banner横幅

    SpringBoot的Banner横幅即在SpringBoot应用程序启动过程中,日志输出的如下内容: 如果想替换此部分内容的话,可以在classpath根路径下建立一个文件,命名为:banner.t ...

  10. H5 - 本地数据存储 - localStorage.setItem