生产者消费者模型
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();
}
}
标签:消费者,Thread,生产者,模型,InterruptedException,queue,int,new,public From: https://www.cnblogs.com/xumu7/p/18147254