多個線程在處理同一個資源,但是處理的動作(線程的任務(wù))卻不相同。?
創(chuàng)新互聯(lián)公司專注于網(wǎng)站建設(shè),為客戶提供網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計開發(fā)服務(wù),多年建網(wǎng)站服務(wù)經(jīng)驗,各類網(wǎng)站都可以開發(fā),成都品牌網(wǎng)站建設(shè),公司官網(wǎng),公司展示網(wǎng)站,網(wǎng)站設(shè)計,建網(wǎng)站費(fèi)用,建網(wǎng)站多少錢,價格優(yōu)惠,收費(fèi)合理。線程狀態(tài)new | 線程剛被創(chuàng)建,但未并被啟動,還沒被調(diào)用Start()方法 |
Runnable | 線程可以在java虛擬器中運(yùn)行的狀態(tài)可能正在運(yùn)行自己代碼,也可能沒有,這取決于操作系統(tǒng)處理器。 |
Blocked | 當(dāng)一 個線程試圖獲取一 個對象鎖, 而該對象鎖被其他的線程持有,則該線程進(jìn)入Blocked狀態(tài) |
Waiting | 個線程在等待另一 一個線程執(zhí)行一個(喚醒)動作時,該線程進(jìn)入Waiting狀態(tài)。? |
Timed Waiting | 同waiting狀態(tài),有幾個方法有超時參數(shù),調(diào)用他們將進(jìn)入Timed Waiting狀態(tài)。? |
Teminated | 因為run方法正常退出而死亡,或者因為沒有捕捉的異常終止了run方法而死亡。 |
??
等待喚醒機(jī)制 什么是等待喚醒機(jī)制:等待喚醒機(jī)制就是在一個線程進(jìn)行了規(guī)定操作后,另一個線程就進(jìn)入等待狀態(tài)(wait()),
等待剛剛進(jìn)行規(guī)定操作的線程執(zhí)行完他們的指定代碼后,再將處于等待狀態(tài)的這個線程喚醒(notify());
在有多個線程進(jìn)行等待的時候,如果需要我們可以使用notifyAll()來喚醒所有的等待線程。
等待通知機(jī)制的方法notify():
通知一個在對象上等待的線程,使其從wait方法喚醒。而喚醒的前提是該線程獲取到了對象的鎖。沒有獲取到的線程依舊處以WAITING狀態(tài)。
notifyAll():
通知所有等待在該對象上的線程。
圖解例題——早餐店包子售賣wait():
調(diào)用該方法的線程進(jìn)入WAITING狀態(tài),只有等待另外線程的通知或被interrupted中斷才會被喚醒。需要注意的是,調(diào)用wait()方法后,會釋放對象的鎖。
包子資源類
public class BaoZi {
String name;//包子的名稱
Boolean flag;//包子的狀態(tài)(true表示存在 false 表示不存在)
}
早餐店線程
public class ZaoCanDian extends Thread {
BaoZi baoZi;
//構(gòu)造函數(shù):用來指定線程的名稱和操作資源
public ZaoCanDian(String name, BaoZi baoZi) {
super(name);
this.baoZi = baoZi;
}
public void run() {
String threadName = Thread.currentThread().getName();
int count = 0;
while (true) {
synchronized (baoZi) {
count++;
if (count >10) {
break;
}
if (baoZi.flag) {//如果包子存在
try {
baoZi.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
//如果包子不存在
System.out.println(threadName + "開始制作" + baoZi.name);
baoZi.flag=true;//更改包子狀態(tài)
baoZi.notify();//喚醒同一資源下的其他線程
}
}
}
}
}
吃貨線程
public class ChiHuo extends Thread{
BaoZi baoZi;
//構(gòu)造函數(shù):用來指定線程的名稱和操作資源
public ChiHuo(String name,BaoZi baoZi){
super(name);
this.baoZi=baoZi;
}
public void run(){
String threadName=Thread.currentThread().getName();
int count=0;
while(true){
synchronized (baoZi){
count++;
if (count>10){
break;
}
if(baoZi.flag){//如果包子存在
System.out.println(threadName+"開始吃"+baoZi.name);
baoZi.flag=false;//修改狀態(tài)
baoZi.notify();//喚醒其他資源狀態(tài)
}else{
//如果包子不存在
try {
baoZi.wait();//進(jìn)入等待狀態(tài)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
早餐店和吃貨間線程的轉(zhuǎn)換
public class ThreadTest {
public static void main(String[] args) {
//定義資源對象
BaoZi baoZi=new BaoZi();
baoZi.name="韭菜 雞蛋 五花肉 豆腐";
baoZi.flag=true;
//定義兩個線程,起名字且操作同一對象
ChiHuo ch=new ChiHuo("空舊黎夢",baoZi);
ZaoCanDian zcd=new ZaoCanDian("豪華",baoZi);
//啟動線程
zcd.start();
ch.start();
}
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
新聞名稱:線程通信機(jī)制-創(chuàng)新互聯(lián)
文章路徑:http://muchs.cn/article34/iopse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、云服務(wù)器、標(biāo)簽優(yōu)化、關(guān)鍵詞優(yōu)化、網(wǎng)站制作、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容