写这篇的时候,用了LinkedBlockingDeque简单的实现了一个消费者生产者模型,有点粗略,但是总体的效果也还是可以的
自我总结一下:
使用类似LinkedBlockingDeque这样的并发集合,其实内部依然还是使用了wait/notify的机制来实现的,既然是别人写好的一个很不错的集合,现在就应该学会拿来使用而比用造轮子,说实话,这样的集合,多点使用,可以减少自己的工作量,同时,别人写的效率也较为的高
public class App{
public static void main(String[] args) {
LinkedBlockingDeque<Integer> queue = new LinkedBlockingDeque<Integer>(100);
queue.clear();
new Thread(new producer(queue),"Producer").start();
new Thread(new consumer(queue),"Consumer").start();
}
static class producer implements Runnable{
private LinkedBlockingDeque<Integer> queue;
public producer(LinkedBlockingDeque<Integer> queue) {
this.queue = queue;
}
@Override
public void run() {
while(true) {
//queue.add(new Random().nextInt());
try {
Integer num = new Random().nextInt();
queue.put(num);
System.out.println(String.format("%s producer a num %d",Thread.currentThread().getName(),num));
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class consumer implements Runnable{
private LinkedBlockingDeque<Integer> queue;
public consumer(LinkedBlockingDeque<Integer> queue) {
this.queue = queue;
}
@Override
public void run() {
while(true) {
try {
System.out.println(String.format("%s consume a num %d",Thread.currentThread().getName(),queue.take()));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
在来看看效果
这个就是很简单的,消费者就一直在等待,你也不用管什么容器内没有了之类的这些问题,就负责等待,有就会消化
简略的代码,轻喷