要求
- 開啓兩個線程交替打印如下字符串: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();
}
}