執行緒通訊 多執行緒同步(生產者消費者例子)

2021-10-20 03:03:30 字數 2687 閱讀 9631

三、常用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...