生产者消费者模型

 

生产者消费者模型

 

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();
}
}

 

posted @   qyx1  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示