Java多線程之交替打印字符練習篇

要求

  • 開啓兩個線程交替打印如下字符串:A1B2C3D45E6F7G8H9I10J11K12L13M14N
    15O16P17Q18R19S20T21U22V23W24X25Y26
  • 線程1負責輸出字母線程二負責輸出數字

如下代碼思路分析

  • 第一步:線程1首先喚醒(notify)等待鎖的線程2,然後線程1自己放棄鎖(wait)跳出同步代碼塊
  • 第二步:線程2獲取到鎖後喚醒(notify)線程1,然後線程2自己放棄鎖,跳出同步代碼塊
  • 第三步:線程1獲取鎖接着第一步同步代碼塊後面執行打印出了大寫字母A,接着喚醒(notify)線程2
  • 第四步:線程2獲取到鎖後接着第二步的同步代碼塊後打印出數字1
  • 第五步:按順序重複執行一,二,三,四步驟
  • 注意點: 線程調用notify方法雖然會喚醒在等待鎖的線程,但是當前線程不會立即釋放鎖同時被喚醒線程也不會立刻得到鎖,而是要等待當前線程執行完同步代碼塊的線程,當前線程才釋放鎖,被喚醒線程才能得到
public class MyThread {
    private static char[] letterArray = {'0','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
    static final Object object = new Object();
    public static void main(String[] args)  {

        new Thread(()-> {
                for(int i=1; i<= 26 ;i++){
                    synchronized (object){
                        object.notify();
                        try {
                            object.wait();
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.print(letterArray[i]);
                        object.notify();
                    }
                }
        }).start();

        new Thread(()-> {
                for(int i=1;i<=26;i++){
                    synchronized (object){
                        object.notify();
                        try {
                            object.wait();
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.print(i);
                    }
                }
        }).start();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章