java中的BlockingQueue(阻塞队列)
时间:2020-02-23 14:41:16 来源:igfitidea点击:
BlockingQueue在Java中引入了具有ConcurrentHashMap的并发包。
它是线程安全队列,从中放置和占用。
BlockingQueue是当一个线程产生对象时使用的特殊类型的队列,并且另一个线程消耗它。
生产者线程将继续将对象插入队列,直到达到上限。
一旦此队列大小达到该限制,那么生产者线程将被阻止,并且无法将对象放入队列,直到消费者线程开始消耗它。
类似地,消费者线程继续从队列中占据对象,直到队列变为空。
一旦队列变为空,消费者线程会被阻止并等待用于将对象插入队列的生产者线程。
如果将null放入blockingqueue,则它将在运行时曝光为nullpointerexception。
它有两个重要方法
put:生产者线程将对象放入队列,直到它到达限制并等待消费者线程在此之后取出对象。
take:消费者线程从队列中取出对象,直到队列变为空。
一旦队列为空,它会等待生产者线程将对象放入队列中。
例子:
在此示例中,我们将看到如何使用blockingqueue。
创建生成器线程,它将创建消费者线程消耗的对象。
- 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 ...