BlockingQueue - CunDeveloper/com.nju.edu.cn.software.school.friend.service GitHub Wiki
BlockingQueue是一个线程安全的队列接口在java.util.concurrent包下。
BlockingQueue典型的场景是一个线程在生产对象,另一个线程在消费对象。场景图如下:
图解释:生产者线程源源不断的制造对象,并插入到队列中。当插入队列达到队列上限时,生产者线程将被阻塞,直到消费者线程从队列中取出对象。 消费者线程源源不断的从队列中取出对象并消费。直到队列为空,当队列为空时,消费者线程将被阻塞,直到生产者线程插入对象到队列中。
4个不同行为对应意思:
如果执行此操作时执行失败,则抛出异常
如果执行此操作时执行失败,则返回一个特殊值(通常为true/false)
如果执行此操作时执行失败,则此方法被阻塞,直到满足条件
如果执行此操作时执行失败,则此方法将被阻塞直到等到规定的超时时间。返回一个特殊的值用来表明此操作时成功还是失败(通常是true/false)
在BlockingQueue中插入一个null值是不允许的,否则他讲抛出一个NullPonterException
在java中BlockingQueue实现类有一下几个
- ArrayBlockingQueue
- DelayQueue
- LinkedBlockingQueue
- PriorityBlockingQueue
- SynchronousQueue
下面是一个BlockingQueue例子,BlockingQueue的实现类使用ArrayBlockingQueue.
public class Example {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
BlockingQueue<String> queue = new ArrayBlockingQueue<>(1024);
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
new Thread(producer).start();
new Thread(consumer).start();
Thread.sleep(4000);
}
}
Producer实现类如下:
public class Producer implements Runnable {
protected BlockingQueue<String> queue = null;
public Producer(BlockingQueue<String> queue){
this.queue = queue;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
queue.put("1");
Thread.sleep(1000);
queue.put("2");
Thread.sleep(1000);
queue.put("3");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Consumer的实现类如下:
public class Consumer implements Runnable {
protected BlockingQueue<String> queue = null;
public Consumer(BlockingQueue<String> queue){
this.queue = queue;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
System.out.println(queue.take());
System.out.println(queue.take());
System.out.println(queue.take());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}