生產者 消費者問題筆記

2022-09-17 16:57:12 字數 2980 閱讀 1452

生產者之間是互斥的,也即同時只能有乙個生產者進行生產

消費者之間是互斥的,也即同時只能有乙個消費者進行消費

生產者消費者之間是互斥的,也即生產者消費者不能同時進行生產和消費

容器滿時,生產者進行等待

容器空是,消費者進行等待

object的synchronized() wait() notifyall()實現

兩個執行緒,乙個產品

//生產消費共10輪

public class democatch(interruptedexception e)

}},"produce").start();

new thread(()->catch(interruptedexception e)

}},"consume").start();

}}class goods

number++;//幹活

system.out.println(thread.currentthread().getname() + "produce" + number);

this.notifyall(); //通知

} public synchronized void consume() throws interruptedexception

number--;

system.out.println(thread.currentthread().getname() + "consume" + number);

this.notifyall(); //通知

}}

四個執行緒,乙個產品
//生產消費共10輪

public class democatch(interruptedexception e)

}},"produce1").start();

new thread(()->catch(interruptedexception e)

}},"produce2").start();

new thread(()->catch(interruptedexception e)

}},"consume1").start();

new thread(()->catch(interruptedexception e)

}},"consume2").start();

}}class goods

number++;//幹活

system.out.println(thread.currentthread().getname() + "produce" + number);

this.notifyall(); //通知

} public synchronized void consume() throws interruptedexception

number--;

system.out.println(thread.currentthread().getname() + "consume" + number);

this.notifyall(); //通知

}}

lockcondition的await() / signal()方法 即管程monitor

四個執行緒,乙個產品

//生產消費共10輪

//生產消費共10輪

public class democatch(interruptedexception e)

}},"produce1").start();

new thread(()->catch(interruptedexception e)

}},"produce2").start();

new thread(()->catch(interruptedexception e)

}},"consume1").start();

new thread(()->catch(interruptedexception e)

}},"consume2").start();

}}class goods

number ++;

system.out.println(thread.currentthread().getname() + "produce" + number);

condition.signalall();

}finally

} public void consume() throws interruptedexception

number ++;

system.out.println(thread.currentthread().getname() + "consume" + number);

condition.signalall();

}finally

}}

使用訊號量semaphore實現生產者-消費者模式

semaphore(訊號量)是用來控制同時訪問特定資源的執行緒數量,它通過協調各個執行緒,以保證合理的使用公共資源,在作業系統中是乙個非常重要的問題,可以用來解決哲學家就餐問題。j**a中的semaphore維護了乙個許可集,一開始先設定這個許可集的數量,可以使用acquire()方法獲得乙個許可,當許可不足時會被阻塞,release()新增乙個許可。

在下列**中,還加入了另外乙個mutex訊號量,維護生產者消費者之間的同步關係,保證生產者和消費者之間的交替進行

public class demo

class producer implements runnablecatch(interruptedexception e)

trycatch(interruptedexception e)finally}}

} class consumer implements runnablecatch(interruptedexception e)

trycatch(interruptedexception e)finally}}

}}

生產者消費者問題

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 ...