淺談線程通信wait,notify作用
線程通信的目的是為了能夠讓線程之間相互發(fā)送信號。另外,線程通信還能夠使得線程等待其它線程的信號,比如,線程B可以等待線程A的信號,這個信號可以是線程A已經處理完成的信號
Wait()方法
-中斷方法的執(zhí)行,使本線程等待,暫時讓出cpu的使用權,并允許其他線程使用這個同步方法
Notify()方法
-喚醒由于使用這個同步方而處于等待線程的某一個結束等待
Notifyall()方法
喚醒所有由于使用這個同步方法而處于等待的線程結束等待
什么時候使用wait方法
當一個線程使用的同步方法中用到某個變量,而此變量又需要其他線程修改才能符合本線程的需要,那么可以在同步方法中使用wait()方法
在這里我以課上的一個例子為例,簡述一下wait和notify的作用
我們已經知道開啟多線程中,如賣票,每個窗口賣的票的順序是隨機的,如果我們有2個賣票窗口,規(guī)定100張票必須輪流賣,A窗口賣完一張票之后下一張票一定是由B窗口賣的,我們如何實現(xiàn)這個功能?
首先我想的是可以設置一個if語句,if(i%2==0)則線程1運行,否則則線程2運行,但是線程1和線程2的運行是隨機的,不能規(guī)定由i的大小來確定誰運行
那我們可以用線程中的wait()和notify()
線程1運行完之后等待一下,然后線程2運行,線程2運行完之后再喚醒線程1然后再次
線程1運行完之后等待一下,然后線程2運行,線程2運行完之后再喚醒線程1
這樣的話可以輪流運行線程1和線程2
我們已打印10個數(shù)為例子來編寫程序,一共建2個類Myprint和MyprintTest
Myprint.java
public class Myprint implements Runnable {
private int i=0;
@Override
public void run() {
try {
print();
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public synchronized void print() throws InterruptedException{
while(i<10){
System.out.println(Thread.currentThread().getName()+":"+i);
i++;
notify();
try {
wait();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
結果如圖

可以看到已經實現(xiàn)了線程1和線程2相互交替打印
只需理解運行過程即可
while(i<10){
System.out.println(Thread.currentThread().getName()+":"+i);
i++;
notify();
try {
wait();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
當i<10時,打印線程1,然后執(zhí)行喚醒,由于前面沒有線程所以這一步不執(zhí)行,然后線程1等待,執(zhí)行完線程2喚醒前面的線程即線程1,然后打印線程1,
這個過程一直執(zhí)行下去直到跳出循環(huán),所以我們可以實現(xiàn)輪流運行
總結
以上就是本文關于淺談線程通信wait,notify作用的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
- Java通過notify和wait實現(xiàn)線程間的通信功能
- Java多線程通信wait()和notify()代碼實例
- java使用wait和notify實現(xiàn)線程通信
- 淺談Java線程間通信之wait/notify
- Java線程通信之wait-notify通信方式詳解
- Java通過wait()和notifyAll()方法實現(xiàn)線程間通信
- Java多線程中的wait/notify通信模式實例詳解
- Java使用wait和notify實現(xiàn)線程之間的通信
- Java使用wait/notify實現(xiàn)線程間通信上篇
- 徹底理解Java線程通信wait / notify(原理 + 實戰(zhàn))
相關文章
Mac電腦如何通過?IntelliJ?IDEA?遠程連接?MySQL
本文詳解Mac通過IntelliJ?IDEA遠程連接MySQL的步驟,本文通過圖文并茂的形式給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2025-08-08
詳解Spring MVC攔截器實現(xiàn)session控制
這篇文章主要介紹了詳解Spring MVC攔截器實現(xiàn)session控制,使用session監(jiān)聽,重復登錄后,強制之前登錄的session過期。有興趣的可以了解一下。2017-01-01
Java notify和notifyAll的區(qū)別和相同
本文主要介紹Java notify和notifyAll的知識,這里整理詳細的資料來說明notify 和NotifAll的區(qū)別,有需要的小伙伴可以參考下2016-09-09

