生产者消费者模型
生产者消费者模型
1. 生产者消费者模型优点
未理解 !
2. 标准库提供的阻塞队列
查看代码
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; class Test { public static void main(String[] args) throws InterruptedException { BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10); Thread t1 = new Thread( () -> { int count = 0; while (true) { try { queue.put(count); System.out.println("生产: " + count++); Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } }); Thread t2 = new Thread( () -> { while (true) { try { System.out.println("消费: " + queue.take()); //Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } }); t1.start(); t2.start(); } }
3. 自己写的阻塞队列
重要细节:
1. put、take 操作加锁
2. 由wait()导致进入阻塞的线程, 也可以被interrupt 打断 -> 加 while ()
class MyBlockingQueue { public volatile int l; public volatile int r; public volatile int size; public int[] queue; public MyBlockingQueue(int n) { this.queue = new int[n]; } public void put(int v) throws InterruptedException { synchronized (this) { while (size >= queue.length) { this.wait(); } queue[r] = v; r = r == (queue.length - 1) ? 0 : ++r; size++; this.notify(); } } public int take() throws InterruptedException { synchronized (this) { while (size == 0) { this.wait(); } int v = queue[l]; l = l == (queue.length - 1) ? 0 : ++l; size--; // 唤醒 this.notify(); return v; } } } class Test { public static void main(String[] args) { MyBlockingQueue queue = new MyBlockingQueue(100); Thread t1 = new Thread( () -> { int count = 0; while (true) { try { queue.put(count); System.out.println("生产: " + count); count++; Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } }); Thread t2 = new Thread(() -> { while (true) { try { System.out.println("消费 " + queue.take()); //Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } }); t1.start(); t2.start(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix