スレッドは順番に交互になります
プログラムを作成して3つのスレッドを開始します。これら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();
}
}
}