java中的BlockingQueue(阻塞队列)

时间:2020-02-23 14:41:16  来源:igfitidea点击:

BlockingQueue在Java中引入了具有ConcurrentHashMap的并发包。

它是线程安全队列,从中放置和占用。

BlockingQueue是当一个线程产生对象时使用的特殊类型的队列,并且另一个线程消耗它。

生产者线程将继续将对象插入队列,直到达到上限。
一旦此队列大小达到该限制,那么生产者线程将被阻止,并且无法将对象放入队列,直到消费者线程开始消耗它。

类似地,消费者线程继续从队列中占据对象,直到队列变为空。
一旦队列变为空,消费者线程会被阻止并等待用于将对象插入队列的生产者线程。

如果将null放入blockingqueue,则它将在运行时曝光为nullpointerexception。

它有两个重要方法

put:生产者线程将对象放入队列,直到它到达限制并等待消费者线程在此之后取出对象。

take:消费者线程从队列中取出对象,直到队列变为空。
一旦队列为空,它会等待生产者线程将对象放入队列中。

例子:

在此示例中,我们将看到如何使用blockingqueue。

创建生成器线程,它将创建消费者线程消耗的对象。

  1. Producer.java.
package org.arpit.theitroad;
 
import java.util.concurrent.BlockingQueue;
 
public class Producer implements Runnable {
 
 BlockingQueue queue=null;
 
 public Producer(BlockingQueue queue) {
  super();
  this.queue = queue;
 }
 
 @Override
 public void run() {
  for (int i = 1; i <=50; i++) {
   System.out.println("Produced item "+i);
   try {
    queue.put("item "+i);
   } catch (InterruptedException e) {
    
    e.printStackTrace();
   }
  }
  
 }
 
}

创建将消耗对象的消费者线程。
2.消费者.java.

package org.arpit.theitroad;
 
import java.util.concurrent.BlockingQueue;
 
public class Consumer implements Runnable {
 
 BlockingQueue queue=null;
 
 public Consumer(BlockingQueue queue) {
  super();
  this.queue = queue;
 }
 
 @Override
 public void run() {
 
  while(true)
  {
   try {
    System.out.println("Consumed "+queue.take());
   } catch (InterruptedException e) {
    //TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
 
}

创建将启动两个线程以上的主类。
3. blockingqueuemain.java.

package org.arpit.theitroad;
 
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
 
public class BlockingQueueMain {
 
 public static void main(String args[])
 {
  BlockingQueue queue=new ArrayBlockingQueue(10);
  Producer producer=new Producer(queue);
  Consumer consumer=new Consumer(queue);
  new Thread(producer).start();
  new Thread(consumer).start();
 }
}

运行上面的程序时,我们将获取以下输出:

Produced item 1
Produced item 2
Consumed item 1
Produced item 3
Consumed item 2
Produced item 4
Consumed item 3
Produced item 5
Consumed item 4
Produced item 6
Consumed item 5
Produced item 7
Consumed item 6
Produced item 8
Consumed item 7
Produced item 9
Consumed item 8
Produced item 10
...