多線程實現有序輸出10次ABC
Lock 和 Condition 同步機制實現
public class Demo1 {
public static void main(String[] args) {
ABC abc=new ABC();
Thread aa=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++)
abc.prinA();
}
});
Thread bb=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++)
abc.prinB();
}
});
Thread cc=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++)
abc.prinC();
}
});
aa.start();
bb.start();
cc.start();
}
}
class ABC {
String s="C";//標記,await條件
private static final Lock lock=new ReentrantLock();
private Condition Acon=lock.newCondition();
private Condition Bcon=lock.newCondition();
private Condition Ccon=lock.newCondition();
public void prinA() {
lock.lock();
try {
while(s!="C") {
Acon.await();
}
System.out.print("A");
s="A";
Bcon.signal();
}catch(Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void prinB() {
lock.lock();
try {
while(s!="A") {
Bcon.await();
}
System.out.print("B");
s="B";
Ccon.signal();
}catch(Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void prinC() {
lock.lock();
try {
while(s!="B") {
Ccon.await();
}
System.out.println("C");
s="C";
Acon.signal();
}catch(Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}