溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java線程通信wait和notify有什么用

發(fā)布時(shí)間:2021-08-07 10:06:06 來(lái)源:億速云 閱讀:120 作者:小新 欄目:編程語(yǔ)言

這篇文章主要為大家展示了“java線程通信wait和notify有什么用”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“java線程通信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)知道開(kāi)啟多線程中,如賣票,每個(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)編寫(xiě)程序,一共建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é)果如圖

java線程通信wait和notify有什么用

可以看到已經(jīng)實(shí)現(xiàn)了線程1和線程2相互交替打印

只需理解運(yùn)行過(guò)程即可

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í)行喚醒,由于前面沒(méi)有線程所以這一步不執(zhí)行,然后線程1等待,執(zhí)行完線程2喚醒前面的線程即線程1,然后打印線程1,

這個(gè)過(guò)程一直執(zhí)行下去直到跳出循環(huán),所以我們可以實(shí)現(xiàn)輪流運(yùn)行

以上是“java線程通信wait和notify有什么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI