Java_多線程實現有序輸出ABC

多線程實現有序輸出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();
		}
	}
	
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章