三、常用api
四、生產者和消費者例子**實現
總結多執行緒的學習接近尾聲了,這次我們的主題是執行緒通訊
通過加鎖的方式保證共享資料訪問的完整性,但是並沒有規定執行緒執行的先後順序。各執行緒到底誰先執行由作業系統的排程決定
在進行多執行緒的設計時,還會遇到另一類問題:如何控制相互互動的執行緒之間的執行順序,及多執行緒的同步
生產者和消費者的問題
1、生產者:先看是否有資料,如果有就等待;如果沒有就生產,生產之後通知消費者來消費
2、消費者:先看是否有資料,如果有就消費;如果沒有就等待,通知生產者生產資料
1、執行緒的安全問題
因為生產者與消費者共享資料緩衝區,不過這個問題可以使用同步解決
2、執行緒協調問題
要解決問題,就必須讓生產者執行緒在緩衝區滿時等待(wait),暫停進入阻塞狀態,等下次消費者消耗了緩衝區中的資料的時間,通知(notify)正在等待的執行緒恢復到就緒狀態,重新開始往緩衝區新增資料。同樣,也可以讓消費者執行緒在緩衝區進入等待(wait),暫停進入阻塞狀態,等到生產者往緩衝區新增資料之後,再通知(notify)正在等待的執行緒恢復到就緒狀態。
wait()
使用當前執行緒放棄同步鎖並進入到等待,直到其他執行緒進入此同步鎖並呼叫notify()或notifyall()方法喚醒該執行緒為止
notify()
喚醒此同步鎖上等待的第乙個呼叫wait()方法的執行緒
notifyall()
喚醒此同步鎖上調wait()方法的所有執行緒
注意:
wait()、notify()、notifyall()這三個方法的呼叫者都應該是同步鎖物件;否則就會報異常
**如下(銀行卡類):
public
class
card
// 有參建構函式
public
card
(string number,
int money, string message)
// 三個屬性get set 方法
public string getnumber()
public
void
setnumber
(string number)
public
intgetmoney()
public
void
setmoney
(int money)
public string getmessage()
public
void
setmessage
(string message)
// 重寫tostring()方法
@override
public string tostring()
}
**如下(生產者執行緒):
public
class
producerrunnable
implements
runnable
@override
public
void
run(
)else
counter++
;//喚醒等待的執行緒
card.
notify()
;}else
catch
(interruptedexception e)}}
}}}
**如下(消費者執行緒):
public
class
consumerrunnable
implements
runnable
@override
public
void
run(
)else
catch
(interruptedexception e)}}
}}}
**如下(測試):
public
class
test01
}
**如下(輸出):
取錢:mom set money 5000
取錢:dad set money 3000
取錢:mom set money 5000
取錢:dad set money 3000
取錢:mom set money 5000
取錢:dad set money 3000
取錢:mom set money 5000
取錢:dad set money 3000
取錢:mom set money 5000
取錢:dad set money 3000
取錢:mom set money 5000
取錢:dad set money 3000
取錢:mom set money 5000
取錢:dad set money 3000
取錢:mom set money 5000
取錢:dad set money 3000
取錢:mom set money 5000
取錢:dad set money 3000
輸出只是擷取了一部分,這個例子一是加強對wait()、notify()的理解和運用,再就是加強對也鎖在多執行緒裡的角色擔當。 多執行緒 生產者消費者
這個就不多說了,直接上 include include using namespace std const unsigned short size of buffer 10 緩衝區長度 unsigned short productid 0 產品號 unsigned short consumeid 0...
多執行緒通訊(生產者,消費者問題)
理解多執行緒通訊,就是要用多執行緒需要有乙個共同的共享資源,通過該共享資源完成執行緒的通訊。例項 工廠 消費者 產品 工廠生產產品,消費者消費產品,產品就成了兩者之間的共享資源 產品的成員屬性 產品名,產品 是否需要生產的標識 public class goods public void setna...
執行緒間通訊 生產者與消費者(多執行緒)
從單執行緒變成多執行緒,想著本來程式裡的判斷語句是 if,而if只判斷一次,想著換成while flag 結果會出現生產乙個商品,消費兩個,或者生產兩個消費乙個的情況,後來才發現把程式中的 notify 全部變成notifyall 就解決了這個問題。public class producercons...