Java 学习笔记 使用synchronized实现生产者消费者模式
程序员文章站
2022-03-30 22:18:24
说明 Object.wait()使当前的线程进入到等待状态(进入到等待队列) Object.notifyAll() 唤醒等待中的全部线程 Object.notify() 随机唤醒一个线程 代码 consumer.java Producer.java Test.java ......
说明
- object.wait()使当前的线程进入到等待状态(进入到等待队列)
- object.notifyall() 唤醒等待中的全部线程
- object.notify() 随机唤醒一个线程
代码
consumer.java
public class consumer extends thread { list<object> container; /*表示当前线程共生产了多少件物品*/ private int count; public consumer(string name, list<object> container) { super(name); this.container = container; } @override public void run() { while(true){ synchronized (container) { try { if (container.isempty()) { //仓库已空,不能消 只能等 container.wait(20); } else { // 消费 container.remove(0); this.count++; system.out.println("消费者:" + getname() + " 共消费了:" + this.count + "件物品,当前仓库里还有" + container.size() + "件物品"); container.notifyall(); // 唤醒等待队列中所有线程 } } catch (interruptedexception e) { e.printstacktrace(); } } try { sleep(10); } catch (interruptedexception e) { e.printstacktrace(); } } } }
producer.java
public class producer extends thread{ list<object> container; /*表示当前线程共生产了多少件物品*/ private int count; public producer(string name, list<object> container) { super(name); this.container = container; } @override public void run() { while (true) { synchronized (container) { try { // 如果某一个生产者能执行进来,说明此线程具有container对象的控制权,其它线程(生产者&消费者)都必须等待 if (container.size() == 10) { // 假设container最多只能放10个物品,即仓库已满 container.wait(10); //表示当前线程需要在container上进行等待 } else { // 仓库没满,可以放物品 container.add(new object()); this.count++; system.out.println("生产者:" + getname() + " 共生产了:" + this.count + "件物品,当前仓库里还有" + container.size() + "件物品"); // 生产者生产了物品后应通知(唤醒)所有在container上进行等待的线程(生产者&消费者) // 生:5, 消:5 // container.notify(); // 随机唤醒一个在等待队列中的线程 container.notifyall(); // 唤醒等待队列中所有线程 } } catch (interruptedexception e) { e.printstacktrace(); } } // try { sleep(20); } catch (interruptedexception e) { e.printstacktrace(); } } } }
test.java
public class test { public static void main(string[] args) { // 仓库 list<object> container = new arraylist<>(); new producer("老王", container).start(); new consumer("小芳", container).start(); new producer("老李", container).start(); new consumer("小荷", container).start(); new producer("老张", container).start(); new consumer("小花", container).start(); new producer("老刘", container).start(); new consumer("小妞", container).start(); new consumer("小米", container).start(); new producer("老马", container).start(); } }
推荐阅读
-
java并发学习之BlockingQueue实现生产者消费者详解
-
Java多线程-同步:synchronized 和线程通信:生产者消费者模式
-
Java多线程-同步:synchronized 和线程通信:生产者消费者模式
-
生产者消费者模式-Java实现(转帖)
-
生产者消费者模式-Java实现(转帖)
-
Java 学习笔记 使用并发包ReentrantLock简化生产者消费者模式代码
-
Java 学习笔记 使用synchronized实现生产者消费者模式
-
2.5多线程(Java学习笔记)生产者消费者模式
-
java wait()/notify() 实现生产者消费者模式详解
-
java中的多线程的实现生产者消费者模式