執行緒中的生產者消費者問題

2021-10-09 13:11:11 字數 2666 閱讀 9948

這是乙個執行緒同步問題,生產者消費者共享乙個資源,並且生產者消費者之間相互依賴,互為條件:

對於生產者,沒有生產產品之前,需通知消費者等待,而生產產品之後需要馬上通知消費者消費;

對於消費者,在消費之後,需要通知生產者已經結束消費,需要生產新的產品提供消費;

在生產者消費者問題中,僅有synchronized是不夠的;

synchronized可阻止併發更新同乙個共享資源,實現了同步;

synchronized不能用來實現不同執行緒之間的訊息傳遞(通訊);

解決方式一:管程法(併發協作模型)

生產者:負責生產資料模組

消費者:負責處理資料模組

緩衝區:生產者將生產好的資料放入緩衝區,消費者從緩衝區拿出資料

例項:

package com.keji.oop;

//解決生產者消費者之間的問題,利用緩衝區解決--管程法

public

classpc}

//生產者

class

producer

extends

thread

//生產

@override

public

void

run()}

}//消費者

class

consumer

extends

thread

//消費

@override

public

void

run()}

}//產品

class

product

}//緩衝區

class

buffer

catch

(interruptedexception e)

}//如果容器未滿,需要丟入產品

products[count]

= product;

count++

;//通知消費者可以消費了

this

.notifyall()

;}//消費者消費產品

public

synchronized product pop()

catch

(interruptedexception e)

}//如果可以消費

count--

; product product = products[count]

;//通知生產者已經消費,讓生產者生產

this

.notifyall()

;return product;

}}

結果:

通過緩衝區解決了生產者消費者的問題!

解決方式二:訊號燈法(併發協作模型)

類似紅燈停,綠燈行,通過使用標誌位方式,來判斷執行緒的監聽、喚醒、等待等;

例項:

package com.keji.oop;

//測試生產者消費者方法2--訊號燈法:標誌位解決

public

class

pc2}

//生產者--演員

class

actor

extends

thread

@override

public

void

run(

)else}}

}//消費者--觀眾

class

audience

extends

thread

@override

public

void

run()}

}//產品--節目

class

program

catch

(interruptedexception e)

} system.out.

println

("演員表演了"

+voice)

;//通知觀眾**

this

.notifyall()

;//通知喚醒

this

.voice = voice;

this

.flag =

!this

.flag;

}//**方法

public

synchronized

void

watch()

catch

(interruptedexception e)

} system.out.

println

("觀眾**了"

+voice)

;//**完後,通知演員表演

this

.notifyall()

;this

.flag =

!this

.flag;

}}

結果:

通過使用標誌位解決了生產者消費者之間的問題!

生產者消費者執行緒

include include include includeusing namespace std typedef int semaphore 訊號量是一種特殊的整型變數 const int size of buffer 5 緩衝區長度 const unsigned short producers...

生產者消費者執行緒

該簡單生產者 消費者執行緒,屬於本人學習過程中的一段練習 如有不足,請指點 package com.lanqiao.demo3 author 大廣子 類說明 簡單的生產者,消費者執行緒 public class threadptcs catch interruptedexception e 退出 s...

執行緒的生產者消費者

新建乙個產品person package cn.lucky.producer author lucky public class person public synchronized void pop 新建生產者 package cn.lucky.producer author lucky publ...