生產者和消費者

2021-10-18 04:11:57 字數 4313 閱讀 9688

**如下:

public

class

producerconsumer

}class

warehouse

catch

(interruptedexception e)

} data++

; system.out.

println

(thread.

currentthread()

.getname()

+"---->"

+data)

;this

.notifyall()

;}//消費商品

public

synchronized

void

con(

)catch

(interruptedexception e)

} data--

; system.out.

println

(thread.

currentthread()

.getname()

+"---->"

+data)

;this

.notifyall()

;}}//生產者執行緒

class

producer

implements

runnable

@override

public

void

run()}

}//消費者執行緒

class

consumer

implements

runnable

@override

public

void

run()}

}

測試結果:

生產者執行緒和消費者執行緒都只有乙個的時候

結果正常

將消費者執行緒和生產者執行緒都增加為兩個

warehouse warehouse =

newwarehouse()

; thread producer =

newthread

(new

producer

(warehouse));

thread consumer =

newthread

(new

consumer

(warehouse));

thread producer1 =

newthread

(new

producer

(warehouse));

thread consumer1 =

newthread

(new

consumer

(warehouse));

producer.

setname

("producer");

consumer.

setname

("consumer");

producer1.

setname

("producer1");

consumer1.

setname

("consumer1");

producer.

start()

; consumer.

start()

; producer1.

start()

; consumer1.

start()

;

測試結果:

結果**現了2 很明顯出現了虛假喚醒的情況解決這種情況應該將if (data == 0)和if(data != 0 )改為while(data==0)和while(data!=0)

出現虛假喚醒的原因:在生產者和消費者執行緒都有多個的情況下,當乙個生產者執行緒搶到了執行緒瑣進入了if**塊並且執行了this.wait()釋放了執行緒瑣,此時另乙個生產者執行緒又搶到了執行緒瑣也進入了if**塊執行了wait方法釋放了瑣,那麼目前就有多個生產者執行緒在if**塊中,當消費者執行緒執行完釋放瑣之後,目前的多個生產者執行緒就不用再進行if判斷只要搶到瑣就執行生產方法,如果生產者執行緒一直搶到瑣 那麼在if語句塊中休眠的生產者執行緒就會全部連續執行生產方法導致data值超過1。同時消費者執行緒也可能會發生這種情況導致data值為負數。

修改後的**:

public

class

producerconsumer

}class

warehouse

catch

(interruptedexception e)

} data++

; system.out.

println

(thread.

currentthread()

.getname()

+"---->"

+data)

;this

.notifyall()

;}//消費商品

public

synchronized

void

con(

)catch

(interruptedexception e)

} data--

; system.out.

println

(thread.

currentthread()

.getname()

+"---->"

+data)

;this

.notifyall()

;}}//生產者執行緒

class

producer

implements

runnable

@override

public

void

run()}

}//消費者執行緒

class

consumer

implements

runnable

@override

public

void

run()}

}

**如下:

僅僅改動了加鎖方式和將wait和notifyall替換成了await和signalall方法

public

class

producerconsumerlock},

"producer").

start()

;new

thread((

)->},

"consumer").

start()

;}}class

warehouselock

data++

; system.out.

println

(thread.

currentthread()

.getname()

+ data)

; condition.

signalall()

;}catch

(interruptedexception e)

finally

}//消費

public

void

con(

) data--

; system.out.

println

(thread.

currentthread()

.getname()

+data)

; condition.

signalall()

;}catch

(interruptedexception e)

finally

}}

測試結果:

生產者消費者 生產者與消費者模式

一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...

生產者和消費者

package demo.one public class producerconsumerdemo 資源 class resource catch interruptedexception e this.name name count system.out.println thread.curre...

生產者和消費者

package com.yuxinyicheng.test2 生產者和消費者的問題 生產者將產品交給店員,而消費者從店員處取走產品,店員一次只能有固定數量的產品 比如 20個 如果生產者試圖生產更多的產品,店員會叫生產者停一下,如果店員中有空位放產品,再通知生產者繼續生產 如果店中沒有產品,店員會告...