BlockingDeque解决生产者与消费者问题的代码如下:
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
/**
* @from www.ityuan.com
* @Description:BlockingDeque解决生产者与消费者问题
*/
class Producer implements Runnable {
private String name;
private BlockingDeque deque;
public Producer(String name, BlockingDeque deque) {
this.name = name;
this.deque = deque;
}
public synchronized void run() {
for (int i = 0; i
try {
deque.putFirst(i);
System.out.println(name + " 已生产,编号: " + i);
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable {
private String name;
private BlockingDeque deque;
public Consumer(String name, BlockingDeque deque) {
this.name = name;
this.deque = deque;
}
public synchronized void run() {
while (true) {
try {
int j = deque.takeLast();
System.out.println(name + " 已消费,编号 " + j);
if (j == 8) {
System.out.println("已吃到了编号"+j+"的面包,饱了,后面的不打算吃了,停止消费喽");
break;
}
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class BlockingDequeTester {
public static void main(String[] args) {
// 定义队列的长度为3。例如一个碗最多只能放6个面包。如果不吃的话,其他的面包放不进来
BlockingDeque deque = new LinkedBlockingDeque(6);
Runnable producer = new Producer("面包", deque);
Runnable consumer = new Consumer("面包", deque);
// 开始生产面包
new Thread(producer).start();
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 开始消费面包
new Thread(consumer).start();
}
}
执行结果如下:
面包 已生产,编号: 0
面包 已生产,编号: 1
面包 已消费,编号 0
面包 已生产,编号: 2
面包 已消费,编号 1
面包 已生产,编号: 3
面包 已消费,编号 2
面包 已生产,编号: 4
面包 已消费,编号 3
面包 已生产,编号: 5
面包 已消费,编号 4
面包 已生产,编号: 6
面包 已消费,编号 5
面包 已生产,编号: 7
面包 已消费,编号 6
面包 已生产,编号: 8
面包 已消费,编号 7
面包 已生产,编号: 9
面包 已消费,编号 8
已吃到了编号8的面包,饱了,后面的不打算吃了,停止消费喽