Java執行緒同步例項 生產者 消費者問題分析

2021-07-24 06:40:41 字數 1360 閱讀 7727

package thread.wait.notify;

public

class

test1

}class

wotou

}class

producer

implements

runnable

public

void run() catch (interruptedexception e) }}

}class

consumer

implements

runnable

public

void run() catch (interruptedexception e) }}

}class

synstack catch (interruptedexception e)

}notify();

wotous[index]=wotou;

index++;

}synchronized wotou pop() catch (interruptedexception e)

}notify();

index--;

return wotous[index];}}

把main函式改為下面**,即增加2個消費者:

public

static

void

main(string args)

執行之後發現會報下面的錯誤:

報錯原因:當producer生產第乙個饅頭之前,饅頭數為0,consumer,consumer2,consumer3都在wait,當producer生產了第乙個饅頭,會執行一次notify,在這個例子notify了consumer3的wait,所以 consumer3吃了饅頭,consumer3吃完後,又會執行notify,而此時wait的包括了consumer,consumer2,因為饅頭為0,notify他們其中之一後,饅頭為-1,當然會報錯。改進方法:把pop函式的if改為while即可,如果當前饅頭為0,則再進入wait狀態:

synchronized wotou pop() catch (interruptedexception e) 

}notify();

index--;

return wotous[index];

}

同理,如果有很多生產者,也需要把push中if改為while。

生產者 消費者模式 Java多執行緒同步

當多個執行緒併發訪問同乙個資源時,可使用生產者 消費者模式解決,通常有訊號燈法和管程法,本文使用訊號燈法實現,其基本思想為 生產者生產時,消費者等待,生產結束後通知消費者消費 消費者消費時,生產者等待,消費完後通知生產者生產。需要object類中wait 方法和notify 或者notifyall ...

java 執行緒同步問題之生產者消費者問題

public class producerandconsumer catch interruptedexception e flag true 設定生產好標誌為true notifyall 通知消費者消費 public synchronized void take int number catch ...

java執行緒 生產者與消費者

package h public class test 倉庫 class godown godown int curnum 生產指定數量的產品 param neednum public synchronized void produce int neednum catch interruptedex...