執行緒協作 生產者消費者問題

2021-10-11 11:10:27 字數 2465 閱讀 5042

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

分析:生產者------沒有生產產品之前,要通知消費者等待,生產產品之後,需要通知消費者消費;

消費者------在消費完之後,要通知生產者消費結束,需要生產新的產品,以供消費。

在這個問題中,只是用synchronized遠遠不夠,因為,synchronized不能用來實現不同執行緒之間的訊息傳遞。這個時候就需要使用執行緒通訊來實現不同執行緒之間的通訊。

使用執行緒通訊方法

方法名作用

wait()

表示執行緒一直等待,知道其他執行緒通知,釋放執行緒上的鎖

wait(long timeout)

指定等待毫秒數

notify()

喚醒乙個處於等待狀態的執行緒

notifyall()

喚醒同乙個物件上所有呼叫wait()方法的執行緒,優先順序高的先排程

這些方法只能在同步方法或者同步**塊中使用。

/**

* 管程法:解決生產者——消費者問題

*/public

class

testpc

}//生產者

class

producer

extends

thread

@override

public

void

run(

)catch

(interruptedexception e)

system.out.

println

("生產了"

+ i +

"隻雞");

}}}//消費者

class

consumer

extends

thread

@override

public

void

run(

)catch

(interruptedexception e)}}

}class

chicken

}class

syncontainer

//如果沒有滿,丟入產品

chickens[count]

= chicken;

count++

;this

.notifyall()

;}public

synchronized chicken pop()

throws interruptedexception

count --

; chicken chicken = chickens[count]

;//消費者消費完了,通知生產者生產

this

.notifyall()

;return chicken;

}}

package syn;

/** * 訊號燈法解決生產者——消費者問題

* 廚師生產,食客消費

*/public

class

testpc3

}//生產者--廚師

class

cooker

extends

thread

@override

public

void

run(

)catch

(interruptedexception e)}}

}//消費者

class

diners

extends

thread

@override

public

void

run(

)catch

(interruptedexception e)}}

}//產品 -- 食物

class

food

system.out.

println

("廚師做了"

+ foodname)

;//通知食客可以吃了

this

.notifyall()

;this

.foodname = foodname;

this

.flag =

!this

.flag;

}//食客吃飯

public

synchronized

void

eat(

)throws interruptedexception

system.out.

println

("吃了"

+ foodname)

;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...

執行緒協作和通訊問題 生產者和消費者問題

解決辦法一 管程法 設定緩衝區 package gcf 生產者,消費者,產品,緩衝區 public class testgcf 生產者 class productor extends thread override public void run 消費者 class cumextends threa...