BlockingQueue - CunDeveloper/com.nju.edu.cn.software.school.friend.service GitHub Wiki

BlockingQueue 定义

BlockingQueue是一个线程安全的队列接口在java.util.concurrent包下。

BlockingQueue使用

BlockingQueue典型的场景是一个线程在生产对象,另一个线程在消费对象。场景图如下:

图解释:生产者线程源源不断的制造对象,并插入到队列中。当插入队列达到队列上限时,生产者线程将被阻塞,直到消费者线程从队列中取出对象。 消费者线程源源不断的从队列中取出对象并消费。直到队列为空,当队列为空时,消费者线程将被阻塞,直到生产者线程插入对象到队列中。

BlockingQueue队列接口的方法

4个不同行为对应意思:

1.ThrowsException

如果执行此操作时执行失败,则抛出异常

2.Special Value

如果执行此操作时执行失败,则返回一个特殊值(通常为true/false)

3.Blocks

如果执行此操作时执行失败,则此方法被阻塞,直到满足条件

4.Time Out

如果执行此操作时执行失败,则此方法将被阻塞直到等到规定的超时时间。返回一个特殊的值用来表明此操作时成功还是失败(通常是true/false)

在BlockingQueue中插入一个null值是不允许的,否则他讲抛出一个NullPonterException

BlockingQueue的实现

在java中BlockingQueue实现类有一下几个

  • ArrayBlockingQueue
  • DelayQueue
  • LinkedBlockingQueue
  • PriorityBlockingQueue
  • SynchronousQueue

java BlockingQueue举例

下面是一个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();
	 }
  }

 }
⚠️ **GitHub.com Fallback** ⚠️