线程按序交替
编写一个程序,开启3个线程,这三个线程的ID分别为A、B、C,每个线程将自己的ID控制台上打印10遍,要求输出的结果必须按照顺序显示。
例如:ABCABCABCABC… 一次递归下去…
public class TestABCLoop {
public static void main(String[] args) {
final ABCLoopDemo loop = new ABCLoopDemo();
new Thread(new Runnable() {
public void run() {
for(int i=1;i<=20;i++){
loop.loopA();
}
}
},"A").start();
new Thread(new Runnable() {
public void run() {
for(int i=1;i<=20;i++){
loop.loopB();
}
}
},"B").start();
new Thread(new Runnable() {
public void run() {
for(int i=1;i<=20;i++){
loop.loopC();
System.out.println("---------第"+i+"轮-------------");
}
}
},"C").start();
}
}
class ABCLoopDemo{
private int flag = 1; //打印标记
private Lock l = new ReentrantLock();
private Condition c1 = l.newCondition();
private Condition c2 = l.newCondition();
private Condition c3 = l.newCondition();
public void loopA(){
l.lock();
try{
//1. 判断
if(flag!=1){
c1.await();
}
//2. 打印
System.out.println(Thread.currentThread().getName());
//3. 唤醒
flag=2;
c2.signal();
}catch(Exception e){
e.printStackTrace();
}finally{
l.unlock();
}
}
public void loopB(){
l.lock();
try{
//1. 判断
if(flag!=2){
c2.await();
}
//2. 打印
System.out.println(Thread.currentThread().getName());
//3. 唤醒
flag=3;
c3.signal();
}catch(Exception e){
e.printStackTrace();
}finally{
l.unlock();
}
}
public void loopC(){
l.lock();
try{
//1. 判断
if(flag!=3){
c3.await();
}
//2. 打印
System.out.println(Thread.currentThread().getName());
//3. 唤醒
flag=1;
c1.signal();
}catch(Exception e){
e.printStackTrace();
}finally{
l.unlock();
}
}
}