問題描述:
生產者消費者問題(producer-consumer problem)是乙個多執行緒同步問題的經典案例。該問題描述了兩個共享固定大小緩衝區的執行緒——即所謂的「生產者」和「消費者」——在實際執行時會發生的問題。生產者的主要作用是生成一定量的資料放到緩衝區中,然後重複此過程。與此同時,消費者也在緩衝區消耗這些資料。該問題的關鍵就是要保證生產者不會在緩衝區滿時加入資料,消費者也不會在緩衝區中空時消耗資料。
要解決該問題,就必須讓生產者在緩衝區滿時休眠(要麼乾脆就放棄資料),等到下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒,開始往緩衝區新增資料。同樣,也可以讓消費者在緩衝區空時進入休眠,等到生產者往緩衝區新增資料之後,再喚醒消費者。
如何模擬這個問題?
為了模擬這個問題,我們假設有乙個籃子,這個籃子用於裝剛剛生產出來的麵包,這個籃子能夠容納的麵包個數是固定的,所以,如果生產者(麵包師傅)發現籃子已經滿了,那麼就返回廚房等待,當消費者拿掉了乙個麵包後,消費者會通知廚房的麵包師傅,這個籃子已經不是滿的了,可以再往裡面加麵包了。
同理,如果消費者發現籃子裡沒有麵包了,那麼他也只能在廳堂等著,當麵包師傅往籃子裡加了麵包以後,麵包師傅會通知那些在廳堂裡等候拿麵包的人,籃子裡面已經有麵包了。
bread類用於模擬麵包
public class bread
public string tostring()
}
public class breadbucket
public synchronized void putbread(bread bread) catch (interruptedexception e)
} container[index] = bread;
index++;
system.out.println("+++++++new bread added: " + bread);
system.out.println("+++++++current # of bread in the bucket:" + index);
this.notify(); // notify consumer, the bucket is not empty.
} public synchronized void takebread() catch (interruptedexception e)
} index--;
bread bread = container[index];
system.out.println("-------consumed bread: " + bread);
system.out.println("-------current # of bread in the bucket:" + index);
this.notify(); // notify producer, the bucket is not full
}}
public class consumer implements runnable
@override
public void run() catch (interruptedexception e)
} }}
public class producer implements runnable
@override
public void run() catch (interruptedexception e)
} }}
public class test
}
生產者消費者問題
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 ...