1. 程式人生 > >建立ABC三條執行緒 保證 A執行緒 列印 我 B執行緒列印愛 C執行緒 列印你 如此需要 10個我愛你

建立ABC三條執行緒 保證 A執行緒 列印 我 B執行緒列印愛 C執行緒 列印你 如此需要 10個我愛你

public class DoSome implements Runnable{

    //三個變數 三條執行緒之間切換執行 一把鎖是不夠的  2把鎖把鎖  物件有鎖的定義 Object物件

    private String word;//執行緒要列印的字
    private Object prev;//當前執行緒的上一個執行緒要持有的鎖
    private Object current;//當前執行緒所要持有的鎖

    public void run() {
        for(int i=0;i<10;i++){
              synchronized (prev){    //鎖住當前執行緒的上一個執行緒
                  synchronized (current){    //鎖住當前執行緒
                      System.out.print(word);    //輸出要列印的文字
                      current.notify();    //喚醒當前的執行緒
                  }
                  try {
                      prev.wait();    //是當前執行緒的上一個執行緒進入阻塞狀態,等待
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
              }
        }
    }
//建立建構函式,傳入形參
    public DoSome(String word, Object prev, Object current) {
        this.word = word;
        this.prev = prev;
        this.current = current;
    }
    //列印字的操作
}
//建立測試類
public class Test {
    public static void main(String[] args) throws InterruptedException {

        Object a =new Object();
        Object b=new Object();
        Object c=new Object();
//建立三條執行緒,並且傳入引數
        Thread t1=new Thread(new DoSome("我",c,a));
        Thread t2=new Thread(new DoSome("愛",a,b));
        Thread t3=new Thread(new DoSome("你",b,c));

//為保證在控制檯上列印的字滿足要求,使第一條執行緒列印完畢後進入阻塞狀態,第二條執行緒列印結束後也進入阻塞狀態
        t1.start();
        Thread.sleep(1000);
        t2.start();
        Thread.sleep(1000);
        t3.start();
    }
}