生產者之間是互斥的,也即同時只能有乙個生產者進行生產
消費者之間是互斥的,也即同時只能有乙個消費者進行消費
生產者消費者之間是互斥的,也即生產者消費者不能同時進行生產和消費
容器滿時,生產者進行等待
容器空是,消費者進行等待
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(); //通知
}}
lock和condition的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 ...