1 public class K { 2 //状态锁
3 private Object lock; 4 //条件变量
5 private int now,need; 6 public void produce(int num){ 7 //同步
8 synchronized (lock){ 9 //当前有的不知足须要,进行等待,直到知足条件
10 while(now < need){ 11 try { 12 //等待阻塞
13 lock.wait(); 14 } catch (InterruptedException e) { 15 e.printStackTrace(); 16 } 17 System.out.println("我被唤醒了!"); 18 } 19 // 作其余的事情
20 } 21 } 22 } 23
1 import java.util.LinkedList; 2
3 /**
4 * 生产者和消费者的问题 5 * wait、notify/notifyAll() 实现 6 */
7 public class Storage1 implements AbstractStorage { 8 //仓库最大容量
9 private final int MAX_SIZE = 100; 10 //仓库存储的载体
11 private LinkedList list = new LinkedList(); 12
13 //生产产品
14 public void produce(int num){ 15 //同步
16 synchronized (list){ 17 //仓库剩余的容量不足以存放即将要生产的数量,暂停生产
18 while(list.size()+num > MAX_SIZE){ 19 System.out.println("【要生产的产品数量】:" + num + "\t【库存量】:"
20 + list.size() + "\t暂时不能执行生产任务!"); 21
22 try { 23 //条件不知足,生产阻塞
24 list.wait(); 25 } catch (InterruptedException e) { 26 e.printStackTrace(); 27 } 28 } 29
30 for(int i=0;i<num;i++){ 31 list.add(new Object()); 32 } 33
34 System.out.println("【已经生产产品数】:" + num + "\t【现仓储量为】:" + list.size()); 35
36 list.notifyAll(); 37 } 38 } 39
40 //消费产品
41 public void consume(int num){ 42 synchronized (list){ 43
44 //不知足消费条件
45 while(num > list.size()){ 46 System.out.println("【要消费的产品数量】:" + num + "\t【库存量】:"
47 + list.size() + "\t暂时不能执行生产任务!"); 48
49 try { 50 list.wait(); 51 } catch (InterruptedException e) { 52 e.printStackTrace(); 53 } 54 } 55
56 //消费条件知足,开始消费
57 for(int i=0;i<num;i++){ 58 list.remove(); 59 } 60
61 System.out.println("【已经消费产品数】:" + num + "\t【现仓储量为】:" + list.size()); 62
63 list.notifyAll(); 64 } 65 } 66 }
- 抽象仓库类java
1 public interface AbstractStorage { 2 void consume(int num); 3 void produce(int num); 4 }
- 生产者编程
1 public class Producer extends Thread{ 2 //每次生产的数量
3 private int num ; 4
5 //所属的仓库
6 public AbstractStorage abstractStorage; 7
8 public Producer(AbstractStorage abstractStorage){ 9 this.abstractStorage = abstractStorage; 10 } 11
12 public void setNum(int num){ 13 this.num = num; 14 } 15
16 // 线程run函数
17 @Override 18 public void run() 19 { 20 produce(num); 21 } 22
23 // 调用仓库Storage的生产函数
24 public void produce(int num) 25 { 26 abstractStorage.produce(num); 27 } 28 }
- 消费者多线程
1 public class Consumer extends Thread{ 2 // 每次消费的产品数量
3 private int num; 4
5 // 所在放置的仓库
6 private AbstractStorage abstractStorage1; 7
8 // 构造函数,设置仓库
9 public Consumer(AbstractStorage abstractStorage1) 10 { 11 this.abstractStorage1 = abstractStorage1; 12 } 13
14 // 线程run函数
15 public void run() 16 { 17 consume(num); 18 } 19
20 // 调用仓库Storage的生产函数
21 public void consume(int num) 22 { 23 abstractStorage1.consume(num); 24 } 25
26 public void setNum(int num){ 27 this.num = num; 28 } 29 }
- 测试ide
1 public class Test{ 2 public static void main(String[] args) { 3 // 仓库对象
4 AbstractStorage abstractStorage = new Storage1(); 5
6 // 生产者对象
7 Producer p1 = new Producer(abstractStorage); 8 Producer p2 = new Producer(abstractStorage); 9 Producer p3 = new Producer(abstractStorage); 10 Producer p4 = new Producer(abstractStorage); 11 Producer p5 = new Producer(abstractStorage); 12 Producer p6 = new Producer(abstractStorage); 13 Producer p7 = new Producer(abstractStorage); 14
15 // 消费者对象
16 Consumer c1 = new Consumer(abstractStorage); 17 Consumer c2 = new Consumer(abstractStorage); 18 Consumer c3 = new Consumer(abstractStorage); 19
20 // 设置生产者产品生产数量
21 p1.setNum(10); 22 p2.setNum(10); 23 p3.setNum(10); 24 p4.setNum(10); 25 p5.setNum(10); 26 p6.setNum(10); 27 p7.setNum(80); 28
29 // 设置消费者产品消费数量
30 c1.setNum(50); 31 c2.setNum(20); 32 c3.setNum(30); 33
34 // 线程开始执行
35 c1.start(); 36 c2.start(); 37 c3.start(); 38
39 p1.start(); 40 p2.start(); 41 p3.start(); 42 p4.start(); 43 p5.start(); 44 p6.start(); 45 p7.start(); 46 } 47 }
- 输出函数
【要消费的产品数量】:50 【库存量】:0 暂时不能执行生产任务! 【要消费的产品数量】:20 【库存量】:0 暂时不能执行生产任务! 【要消费的产品数量】:30 【库存量】:0 暂时不能执行生产任务! 【已经生产产品数】:10 【现仓储量为】:10 【要消费的产品数量】:30 【库存量】:10 暂时不能执行生产任务! 【要消费的产品数量】:20 【库存量】:10 暂时不能执行生产任务! 【要消费的产品数量】:50 【库存量】:10 暂时不能执行生产任务! 【已经生产产品数】:10 【现仓储量为】:20 【已经生产产品数】:10 【现仓储量为】:30 【要消费的产品数量】:50 【库存量】:30 暂时不能执行生产任务! 【已经消费产品数】:20 【现仓储量为】:10 【要消费的产品数量】:30 【库存量】:10 暂时不能执行生产任务! 【已经生产产品数】:10 【现仓储量为】:20 【要消费的产品数量】:50 【库存量】:20 暂时不能执行生产任务! 【要消费的产品数量】:30 【库存量】:20 暂时不能执行生产任务! 【已经生产产品数】:10 【现仓储量为】:30 【已经消费产品数】:30 【现仓储量为】:0 【要消费的产品数量】:50 【库存量】:0 暂时不能执行生产任务! 【已经生产产品数】:10 【现仓储量为】:10 【要消费的产品数量】:50 【库存量】:10 暂时不能执行生产任务! 【已经生产产品数】:80 【现仓储量为】:90 【已经消费产品数】:50 【现仓储量为】:40