淺談線程通信wait,notify作用
線程通信的目的是為了能夠讓線程之間相互發(fā)送信號(hào)。另外,線程通信還能夠使得線程等待其它線程的信號(hào),比如,線程B可以等待線程A的信號(hào),這個(gè)信號(hào)可以是線程A已經(jīng)處理完成的信號(hào)
Wait()方法
-中斷方法的執(zhí)行,使本線程等待,暫時(shí)讓出cpu的使用權(quán),并允許其他線程使用這個(gè)同步方法
Notify()方法
-喚醒由于使用這個(gè)同步方而處于等待線程的某一個(gè)結(jié)束等待
Notifyall()方法
喚醒所有由于使用這個(gè)同步方法而處于等待的線程結(jié)束等待
什么時(shí)候使用wait方法
當(dāng)一個(gè)線程使用的同步方法中用到某個(gè)變量,而此變量又需要其他線程修改才能符合本線程的需要,那么可以在同步方法中使用wait()方法
在這里我以課上的一個(gè)例子為例,簡(jiǎn)述一下wait和notify的作用
我們已經(jīng)知道開啟多線程中,如賣票,每個(gè)窗口賣的票的順序是隨機(jī)的,如果我們有2個(gè)賣票窗口,規(guī)定100張票必須輪流賣,A窗口賣完一張票之后下一張票一定是由B窗口賣的,我們?nèi)绾螌?shí)現(xiàn)這個(gè)功能?
首先我想的是可以設(shè)置一個(gè)if語(yǔ)句,if(i%2==0)則線程1運(yùn)行,否則則線程2運(yùn)行,但是線程1和線程2的運(yùn)行是隨機(jī)的,不能規(guī)定由i的大小來(lái)確定誰(shuí)運(yùn)行
那我們可以用線程中的wait()和notify()
線程1運(yùn)行完之后等待一下,然后線程2運(yùn)行,線程2運(yùn)行完之后再喚醒線程1然后再次
線程1運(yùn)行完之后等待一下,然后線程2運(yùn)行,線程2運(yùn)行完之后再喚醒線程1
這樣的話可以輪流運(yùn)行線程1和線程2
我們已打印10個(gè)數(shù)為例子來(lái)編寫程序,一共建2個(gè)類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(); } } } }
結(jié)果如圖
可以看到已經(jīng)實(shí)現(xiàn)了線程1和線程2相互交替打印
只需理解運(yùn)行過程即可
while(i<10){ System.out.println(Thread.currentThread().getName()+":"+i); i++; notify(); try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } }
當(dāng)i<10時(shí),打印線程1,然后執(zhí)行喚醒,由于前面沒有線程所以這一步不執(zhí)行,然后線程1等待,執(zhí)行完線程2喚醒前面的線程即線程1,然后打印線程1,
這個(gè)過程一直執(zhí)行下去直到跳出循環(huán),所以我們可以實(shí)現(xiàn)輪流運(yùn)行
總結(jié)
以上就是本文關(guān)于淺談線程通信wait,notify作用的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
servlet的url-pattern匹配規(guī)則詳細(xì)描述(小結(jié))
在利用servlet或Filter進(jìn)行url請(qǐng)求的匹配時(shí),很關(guān)鍵的一點(diǎn)就是匹配規(guī)則。這篇文章主要介紹了servlet的url-pattern匹配規(guī)則詳細(xì)描述(小結(jié)),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-07-07Java中將String類型轉(zhuǎn)換為int類型的幾種常見方法
在java中經(jīng)常會(huì)遇到需要對(duì)數(shù)據(jù)進(jìn)行類型轉(zhuǎn)換的場(chǎng)景,這篇文章主要給大家介紹了關(guān)于Java中將String類型轉(zhuǎn)換為int類型的幾種常見方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07java利用pdfbox+poi往pdf插入數(shù)據(jù)
這篇文章主要給大家介紹了關(guān)于java利用pdfbox+poi如何往pdf插入數(shù)據(jù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02Security 登錄認(rèn)證流程詳細(xì)分析詳解
本文Security登錄認(rèn)證流程詳細(xì)分析詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Java 定時(shí)器(Timer)及線程池里使用定時(shí)器實(shí)例代碼
這篇文章主要介紹了Java 定時(shí)器(Timer)及線程池里使用定時(shí)器實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-12-12@Transactional遇到try catch失效的問題
這篇文章主要介紹了@Transactional遇到try catch失效的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01