国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

淺談線程通信wait,notify作用

2024-07-13 10:15:29
字體:
來源:轉載
供稿:網友

java/215125.html">線程通信的目的是為了能夠讓線程之間相互發送信號。另外,線程通信還能夠使得線程等待其它線程的信號,比如,線程B可以等待線程A的信號,這個信號可以是線程A已經處理完成的信號

Wait()方法

-中斷方法的執行,使本線程等待,暫時讓出cpu的使用權,并允許其他線程使用這個同步方法

Notify()方法

-喚醒由于使用這個同步方而處于等待線程的某一個結束等待

Notifyall()方法

喚醒所有由于使用這個同步方法而處于等待的線程結束等待

什么時候使用wait方法

當一個線程使用的同步方法中用到某個變量,而此變量又需要其他線程修改才能符合本線程的需要,那么可以在同步方法中使用wait()方法

在這里我以課上的一個例子為例,簡述一下wait和notify的作用

我們已經知道開啟多線程中,如賣票,每個窗口賣的票的順序是隨機的,如果我們有2個賣票窗口,規定100張票必須輪流賣,A窗口賣完一張票之后下一張票一定是由B窗口賣的,我們如何實現這個功能?

首先我想的是可以設置一個if語句,if(i%2==0)則線程1運行,否則則線程2運行,但是線程1和線程2的運行是隨機的,不能規定由i的大小來確定誰運行

那我們可以用線程中的wait()和notify()

線程1運行完之后等待一下,然后線程2運行,線程2運行完之后再喚醒線程1然后再次

線程1運行完之后等待一下,然后線程2運行,線程2運行完之后再喚醒線程1

這樣的話可以輪流運行線程1和線程2

我們已打印10個數為例子來編寫程序,一共建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();		}	}}}

結果如圖

線程,wait,notify,java

可以看到已經實現了線程1和線程2相互交替打印

只需理解運行過程即可

while(i<10){	System.out.println(Thread.currentThread().getName()+":"+i);	i++;	notify();	try {		wait();	}	catch (InterruptedException e) {		e.printStackTrace();	}}}}

當i<10時,打印線程1,然后執行喚醒,由于前面沒有線程所以這一步不執行,然后線程1等待,執行完線程2喚醒前面的線程即線程1,然后打印線程1,

這個過程一直執行下去直到跳出循環,所以我們可以實現輪流運行

總結

以上就是本文關于淺談線程通信wait,notify作用的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 项城市| 河池市| 延津县| 丰城市| 余姚市| 甘孜县| 板桥市| 余干县| 佛冈县| 阿拉尔市| 东乌| 新绛县| 景德镇市| 苍南县| 中方县| 卓资县| 安远县| 柘荣县| 金川县| 罗山县| 盘锦市| 轮台县| 连州市| 平罗县| 天台县| 兰州市| 菏泽市| 祁连县| 桦川县| 临颍县| 民县| 焦作市| 枞阳县| 建瓯市| 吉安县| 油尖旺区| 德保县| 余庆县| 达尔| 洛南县| 平陆县|