您的位置:首页 > 其它

控制三个线程交替打印ABC

2018-01-10 17:38 393 查看
package me.zyc.thread.test;

import java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject;
import java.util.concurrent.locks.ReentrantLock;

public class LoopRunByOrder {
private static ReentrantLock lock = new ReentrantLock();
private static String flag = "A";
private static ConditionObject conditionA = (ConditionObject) lock.newCondition();
private static ConditionObject conditionB = (ConditionObject) lock.newCondition();
private static ConditionObject conditionC = (ConditionObject) lock.newCondition();

public static void main(String[] args) throws InterruptedException {
new Thread(new TaskA(), "ThreadA").start();
new Thread(new TaskB(), "ThreadB").start();
new Thread(new TaskC(), "ThreadC").start();
}

static class TaskA implements Runnable{
@Override
public void run() {
int i = 5;
while(i-- > 0){
lock.lock();
try {
if(!flag.equals("A")){
conditionA.await();
}
System.out.println("A");
flag = "B";
conditionB.signal();
} catch (Exception e) {
// TODO: handle exception
} finally{
lock.unlock();
}
}
}
}

static class TaskB implements Runnable{
@Override
public void run() {
int i = 5;
while(i-- > 0){
lock.lock();
try {
if(!flag.equals("B")){
conditionB.await();
}
System.out.println("B");
flag = "C";
conditionC.signal();
} catch (Exception e) {
// TODO: handle exception
} finally{
lock.unlock();
}
}
}
}

static class TaskC implements Runnable{
@Override
public void run() {
int i = 5;
while(i-- > 0){
lock.lock();
try {
if(!flag.equals("C")){
conditionC.await();
}
System.out.println("C");
flag = "A";
conditionA.signal();
} catch (Exception e) {
// TODO: handle exception
} finally{
lock.unlock();
}
}
}

}

}


运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐