**如下:
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個 如果生產者試圖生產更多的產品,店員會叫生產者停一下,如果店員中有空位放產品,再通知生產者繼續生產 如果店中沒有產品,店員會告...