# **:
publicclass
public
static
void
main(string args)
}class
producer
public
void produce(final
intval)
}.start();
}}class
consumer
public
void consume(final
intval)
}.start();
}}class
depot
public
void produce(int
val)
int incre = (size + surplus) > capacity ? (capacity -size) : surplus;
size +=incre;
surplus -=incre;
system.out.printf("%s plan to produce (%d), actually produce (%d), depot size (%d) \n",
thread.currentthread().getname(), val, incre, size);
emptycondition.signal();}}
catch
(interruptedexception e)
finally
}public
void consume(int
val)
int desc = (size < surplus) ?size : surplus;
size -=desc;
surplus -=desc;
system.out.printf("%s plan to consume (%d), actutally consume (%d), depot size (%d) \n",
thread.currentthread().getname(), val, desc, size);
fullcondition.signalall();}}
catch
(interruptedexception e)
finally
}}
# 輸出:
thread-0 plan to produce (60), actually produce (60), depot size (60)
thread-1 plan to consume (100), actutally consume (60), depot size (0)
thread-2 plan to produce (90), actually produce (90), depot size (90)
thread-3 plan to consume (40), actutally consume (40), depot size (50)
thread-1 plan to consume (100), actutally consume (40), depot size (10)
# 有四個執行緒參與了這個過程,兩個生產者,兩個消費者
# 這是幾個月之後的補充。。。。。。。。手動笑哭。
# 幾個月之後,我重新回顧了這些內容。。。發現了上面的**有坑!!!
# 首先我們來重現此坑
publicstatic
void
main(string args)
for (int i = 0; i < 50; i++)
}
- main 方法是這個樣子,在這種情況下,有時候會出現程式卡住的情況
- 用jstack看了一下堆疊資訊,發現有幾個consumer執行緒一直處於locked狀態,但是已經沒有人去喚醒他們了
- 分析了一下,其實原因很明顯,我們在produce時,喚醒consumer使用的是signal(),最後乙個生產者在喚醒某乙個消費者之後,該消費者消費完了就再也沒有生產者了,這時剩下的消費者執行緒就沒有人喚醒他們了。。。換成signalall()就ok了。
# 還有乙個需要注意的是進入 await()的判斷條件一定要使用while, 盡量不要使用if, 這個問題我會在 synchronized 實現的生產者-消費者模組中給出原因
生產者消費者問題
public class producer consumer class godown public godown int num public synchronized void produce int n catch interruptedexception e curr num n syste...
生產者 消費者問題
在學習程序互斥中,有個著名的問題 生產者 消費者問題。這個問題是乙個標準的 著名的同時性程式設計問題的集合 乙個有限緩衝區和兩類執行緒,它們是生產者和消費者,生產者把產品放入緩衝區,相反消費者便是從緩衝區中拿走產品。生產者在緩衝區滿時必須等待,直到緩衝區有空間才繼續生產。消費者在緩衝區空時必 須等待...
生產者 消費者問題
1 程序互斥問題 緩衝區b是臨界資源,程序p和c不能同時對b進行操作,即只能互斥的操作 2 程序同步問題 p不能往 滿 的的緩衝區b放產品,c不能從空的緩衝區獲得產品。當緩衝區滿時,c必須先於p執行,當緩衝區空時,p必須先於c執行 我們給出如下基於記錄型 二元 訊號量機制的解法 10 9 2013 ...