【多執行緒】如何實現執行緒通訊
阿新 • • 發佈:2021-02-09
目錄
一、引入
什麼是執行緒通訊?
執行緒通訊指的是多個執行緒通過訊息傳遞實現相互牽制,相互排程,即執行緒間的相互作用。
二、如何實現
1、涉及到的三個方法
wait()
:一旦執行此方法,當前執行緒就會進入阻塞狀態,並釋放同步監視器
notify()
:一旦執行此方法,就會喚醒被wait的另一個執行緒,如果有多個執行緒被wait,那麼喚醒優先順序高的那個
notifyAll()
:一旦執行此方法,就會喚醒所有被wait的執行緒
2、對這三個方法的說明
這三個方法只能在同步程式碼塊或同步方法中使用
這三個方法的呼叫者必須是同步程式碼塊或同步方法中的同步監視器
這三個方法定義在Object中,因為同步監視器可以是任何類的物件,而這三個方法必須是同步監視器呼叫
3、程式碼舉例
案例:兩個執行緒交替列印1-100
public class Number implements Runnable {
private int number = 1;
@Override
public void run() {
while (true) {
synchronized (this) {
//喚醒被阻塞的執行緒
notify();
if (number <= 100) {
System.out.println(Thread.currentThread().getName() + ":" + number);
number++;
try {
//讓當前執行緒進入阻塞狀態,並且釋放同步監視器
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
break;
}
}
}
}
}
三、面試題
sleep()和wait()的異同
-
相同點
①:都可以讓當前執行緒進入阻塞狀態
-
不同點
①:兩個方法所屬的位置不同:Thread中的sleep、Object中的wait
②:在程式碼中書寫的位置不同:sleep可以在任何地方呼叫、wait必須使用在同步程式碼塊或同步方法中
③:是否釋放同步監視器:sleep不會釋放同步監視器、wait會釋放同步監視器