线程轮循打印ABC...
1 package com.java.concurrent; 2 3 import java.util.concurrent.locks.Condition; 4 import java.util.concurrent.locks.Lock; 5 import java.util.concurrent.locks.ReentrantLock; 6 7 /** 8 * 使用多线程的方式进行轮循打印ABCABC 9 * @author fliay 10 * 11 */ 12 public class TestABCAlternate { 13 14 public static void main(String[] args) { 15 final AlternateDemo ad = new AlternateDemo(); 16 new Thread(new Runnable() { 17 18 public void run() { 19 for(int i = 1;i<10;i++){ 20 try { 21 ad.loopA(i); 22 } catch (InterruptedException e) { 23 // TODO Auto-generated catch block 24 e.printStackTrace(); 25 } 26 } 27 } 28 },"线程1").start(); 29 30 new Thread(new Runnable() { 31 32 public void run() { 33 for(int i = 1;i<10;i++){ 34 try { 35 ad.loopB(i); 36 } catch (InterruptedException e) { 37 // TODO Auto-generated catch block 38 e.printStackTrace(); 39 } 40 } 41 } 42 },"线程2").start(); 43 44 45 new Thread(new Runnable() { 46 47 public void run() { 48 for(int i = 1;i<10;i++){ 49 try { 50 ad.loopC(i); 51 } catch (InterruptedException e) { 52 // TODO Auto-generated catch block 53 e.printStackTrace(); 54 } 55 } 56 } 57 },"线程3").start(); 58 59 60 61 } 62 63 64 65 } 66 67 68 class AlternateDemo{ 69 70 private int number=1;//当前正在执行的线程标记 71 72 private Lock lock = new ReentrantLock(); 73 74 private Condition condition1 = lock.newCondition(); 75 private Condition condition2 = lock.newCondition(); 76 private Condition condition3 = lock.newCondition(); 77 78 public void loopA(int totalLoop) throws InterruptedException{ 79 lock.lock(); 80 try{ 81 //1.判断 82 if(number!=1){ 83 condition1.await(); 84 } 85 //2.打印 86 System.out.println(Thread.currentThread().getName()+":A"+"-"+totalLoop); 87 88 //3.唤醒 89 number=2; 90 condition2.signal(); 91 }finally{ 92 lock.unlock(); 93 } 94 } 95 96 public void loopB(int totalLoop) throws InterruptedException{ 97 lock.lock(); 98 try{ 99 //1.判断 100 if(number!=2){ 101 condition2.await(); 102 } 103 //2.打印 104 System.out.println(Thread.currentThread().getName()+":B"+"-"+totalLoop); 105 106 //3.唤醒 107 number=3; 108 condition3.signal(); 109 }finally{ 110 lock.unlock(); 111 } 112 } 113 114 115 public void loopC(int totalLoop) throws InterruptedException{ 116 lock.lock(); 117 try{ 118 //1.判断 119 if(number!=3){ 120 condition3.await(); 121 } 122 //2.打印 123 System.out.println(Thread.currentThread().getName()+":C"+"-"+totalLoop); 124 125 //3.唤醒 126 number=1; 127 condition1.signal(); 128 }finally{ 129 lock.unlock(); 130 } 131 } 132 133 134 135 136 137 138 139 140 141 142 143 144 }
转载于:https://www.cnblogs.com/fliay/p/7680746.html
线程轮循打印ABC...相关推荐
- 让3个线程打印ABC
让3个线程依次打印ABC,是一个常见的(面试)问题,这是阿里和华为都有考过的面试题.比如题目描述如下: 编写一个程序,开启三个线程,这三个线程按照顺序依次打印ABC,每个字母打印10次后结束,最后结果 ...
- 三个线程交替打印ABC(Condition实现精确通知)
三个线程交替打印ABC: package pc;import java.util.concurrent.locks.Condition; import java.util.concurrent.loc ...
- python两个线程交替打印_三线程按顺序交替打印ABC的四种方法
建立三个线程A.B.C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印. 二.Synchroni ...
- 多线程面试题之【三线程按顺序交替打印ABC的方法】
建立三个线程,线程名字分别为:A.B.C,要求三个线程分别打印自己的线程名字,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印.打印10轮,打印完毕控制台输出字符串:&q ...
- 三个线程轮流执行顺序打印ABC
方法1:使用boolean标记 package com.ziyear.exam;/*** 3个线程,顺序打印ABC10次*/ public class PrintThread_ABC_10_1 {/* ...
- JavaScript学习笔记(五)---cookie、Proxy、服务器、PHP语言、http协议、同步异步、事件轮循机制、ajax编写、接口
JavaScript学习笔记(五)---cookie.Proxy.服务器.PHP语言.http协议.同步异步.事件轮循机制.ajax编写.接口 1.cookie 1.1cookie概念 1.2cook ...
- 时间片(time-slicing)轮循调度(round-robin scheduling)
1.轮循调度 通过tx_thread_relinquish实现. 通过其处理具有相同优先级的多个线程,为相同优先级的所有其他就绪线程提供了在 relinquish 调用方再次执行之前执行的机会. 2. ...
- linux多线程顺序打印abc,c++11 多线程依次打印ABC
并发 练习代码 #include #include #include #include using namespace std; std::mutex mtx; std::condition_vari ...
- 常见的面试算法题:创建几个线程按顺序打印数字或者字母(多线程编程)(套用该模板即可)
常见的面试算法题:创建几个线程按顺序打印数字或者字母(多线程编程)(套用该模板即可) 比较典型的题目,如下有: 题目一: 1.启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程 ...
最新文章
- 【Java】6.4 final 修饰符
- python图像开闭区间_自动开闭器不良故障案例分析
- jQuery的位置信息和事件
- Javascript基础系列之(六)循环语句(do while循环)
- android文件读写操作布局文件代码,android实现文件读写功能
- duration java_Java Duration类| 带示例的getUnits()方法
- WordPress主题zibll子比主题+新增阿里云短信/腾讯云/短信宝/风吹雨短信接口
- 查找数组中特定元素_Leetcode 540 题 有序数组中的单一元素
- 【颗粒归仓】(四)代码走查工具---StyleCop
- 绿点 | 区块链介入下的绿色经济 x 妳格局LadyVision x WinMap+!
- 开箱:阿里技术人在读什么书?
- 如何使用pr制作视频人物运动残影特效
- python bunch制作可导入数据_python – ImportError:无法导入名称Bunch scikit-learn 0.19
- MathType无法加载mathpage.wll文件
- ecli中@Data标签getset不起作用
- Cobaltstrike系列教程(十一)提权与横向移动
- ug怎么画曲线_120种UG表达式曲线画法
- 《Delta-Sigma数据转换器从入门到精通》笔记之漫谈均值
- 代码主题darcula_仿IntelliJ Darcula的Swing主题FlatLaf使用方法
- 做一个精致的电子工程师