前言
之前一直不明白生产者和消费者模式的实现方式,懂得原理,旧版的实现方式代码比较冗余。所以这里采用一种比较推荐的方式来实现。
BlockingQueue阻塞队列介绍
LinkedBlockingQueue
由于LinkedBlockingQueue实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。
具体代码实现:
先编写生产者
import java.util.concurrent.BlockingQueue;
public class ProducerQueue implements Runnable{
private final BlockingQueue proQueue;
public ProducerQueue(BlockingQueue proQueue) {
this.proQueue = proQueue;
}
@Override
public void run() {
for (int i=1;i<=10;i++)
{
try {
System.out.println("生产者生产的产品编号为 : " +i);
proQueue.put(i);
Thread.sleep(3000); //为了容易辨别,等待3s
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}
消费者
import java.util.concurrent.BlockingQueue;
public class ConsumerQueue implements Runnable {
private final BlockingQueue conQueue;
public ConsumerQueue(BlockingQueue conQueue) {
this.conQueue = conQueue;
}
@Override
public void run() {
for (;;)
{
try {
System.out.println("消费者消费的产品编号为 :" +conQueue.take());
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}
在main()方法里运行
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class Test {
public static void main(String[] args) {
BlockingQueue publicBoxQueue = new LinkedBlockingQueue(2); //存放两个对象,一个生产者,一个消费者
Thread con = new Thread(new ConsumerQueue(publicBoxQueue));
Thread pro = new Thread(new ProducerQueue(publicBoxQueue));
pro.start();
con.start();
}
}
实现结果:
使用BlockingQueue方式的生产者和消费者无论从逻辑上还是代码量上都比原始的方式简单。推荐使用这种方式