Java多線程中的生産者與消費者模式
建立Factory類(工廠類)
public class Factory {
//商品數量
private int num = 0;
//商品可允許最大值
private static final int NUM_MAX = 100;
//同步生産方法
public synchronized void product() throws InterruptedException {
//擷取線程名字
String name = Thread.currentThread().getName();
//判斷是否小于最大值
if (num<NUM_MAX) {
//持續生産
num++;
System.out.println(name+"生産了一個商品,還剩下"+num+"個商品");
}else {
System.out.println("倉庫已滿"+name+"無需生産");
//休眠目前線程
this.wait();
//喚醒銷售者線程
this.notify();
}
}
//同步銷售方法
public synchronized void sell() throws InterruptedException {
//擷取目前線程名稱
String name = Thread.currentThread().getName();
//判斷商品數量是否大于0
if (num>0) {
//持續銷售商品
num--;
System.out.println(name+"銷售了一個商品,還剩下"+num+"個商品");
}else {
System.out.println("倉庫已空"+name+"無需銷售");
//喚醒生産者線程
this.notify();
//睡眠目前線程
this.wait();
}
}
}
建立 ProductRunnable 類(生産者類)
public class ProductRunnable implements Runnable{
//工廠屬性
private Factory factory;
//構造函數
public ProductRunnable(Factory factory) {
super();
this.factory = factory;
}
@Override
public void run() {
//建立死循環
while(true) {
try {
//休眠100ms
Thread.sleep(100);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
//調用工廠中的生産方法;
factory.product();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
建立 SellRunnable類(銷售者類)
public class SellRunnable implements Runnable{
//工廠屬性
private Factory factory;
//構造函數
public SellRunnable(Factory factory) {
super();
this.factory = factory;
}
@Override
public void run() {
// TODO Auto-generated method stub
//建立死循環
while(true) {
try {
//休眠100ms
Thread.sleep(100);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
//調用工廠中的銷售方法;
factory.sell();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
測試類
public class Main {
public static void main(String[] args) {
//建立工廠對象
Factory factory = new Factory();
//建立銷售任務對象
SellRunnable sellRunnable = new SellRunnable(factory);
//建立生産任務對象
ProductRunnable productRunnable = new ProductRunnable(factory);
//建立線程,并傳入線程任務,和設定名稱
Thread t0 = new Thread(sellRunnable,"小飛");
Thread t1 = new Thread(sellRunnable,"小焦");
Thread t2 = new Thread(sellRunnable,"小王");
Thread t3 = new Thread(sellRunnable,"小李");
Thread t4 = new Thread(productRunnable,"牛工");
Thread t5 = new Thread(productRunnable,"張工");
Thread t6 = new Thread(productRunnable,"龍哥 ");
Thread t7 = new Thread(productRunnable,"小牛");
//啟動線程
t0.start();
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
t7.start();
}
}
編寫思路
作用:描繪工廠的生産與銷售
分析:
對象:
工廠
剩餘商品數量
最大可容納商品數量
生産的方法
銷售的方法
生産人員
死循環
生産
銷售人員
死循環
銷售
類:
工廠類
屬性:
剩餘商品數量
最大可容納商品數量
方法:
生産的方法,一個線程安全的方法
步驟:
1,判斷剩餘商品數量小于最大可容納商品數量
剩餘商品數量++
提示:誰誰誰生産了一個産品,現在還有xxx個商品
喚醒消費線程
2,剩餘商品數量大于等于最大可容納商品數量
喚醒消費線程
提示:倉庫已滿,生産人員xxx休息
休眠目前線程
銷售的方法,一個線程安全的方法
步驟:
1,判斷剩餘商品數量大于0
剩餘商品數量--
提示:誰誰誰賣出一個産品,現在還有xxx個商品
喚醒生産者線程
2,剩餘商品數量小于等于0
喚醒生産者線程
提示:已經無貨,銷售人員xxx休息
休眠目前線程
生産任務類
死循環調用生産方法
注意:生産任務與銷售任務對象的所有的工廠對象為一個對象
銷售任務類
死循環調用銷售方法
注意:生産任務與銷售任務對象的所有的工廠對象為一個對象
環境類
先寫main方法
步驟:
1,建立工廠
2,建立生産任務,傳入工廠
3,建立銷售任務,傳入工廠
4,建立生産人員
建立生産人員對象(線程對象),傳入生産任務對象
建立生産人員對象(線程對象),傳入生産任務對象
建立生産人員對象(線程對象),傳入生産任務對象
建立生産人員對象(線程對象),傳入生産任務對象
建立生産人員對象(線程對象),傳入生産任務對象
...
5,建立銷售人員
建立銷售人員對象(線程對象),傳入銷售任務對象
...
6,啟動線程