你的位置:首页 > 软件开发 > Java > 【译】使用阻塞队列解决生产者

【译】使用阻塞队列解决生产者

发布时间:2016-06-02 16:00:10
如果你想避免使用错综复杂的wait–notify的语句,BlockingQueue非常有用。BlockingQueue可用于解决生产者-消费者问题,如下代码示例。对于每个开发人员来说,生产者消费者问题已经非常熟悉了,这里我将不做详细描述。为什么Blocking ...

【译】使用阻塞队列解决生产者

如果你想避免使用错综复杂的waitnotify的语句,BlockingQueue非常有用。BlockingQueue可用于解决生产者-消费者问题,如下代码示例。对于每个开发人员来说,生产者消费者问题已经非常熟悉了,这里我将不做详细描述。

为什么BlockingQueue适合解决生产者消费者问题

任何有效的生产者-消费者问题解决方案都是通过控制生产者put()方法(生产资源)和消费者take()方法(消费资源)的调用来实现的,一旦你实现了对方法的阻塞控制,那么你将解决该问题。

Java通过BlockingQueue提供了开箱即用的支持来控制这些方法的调用(一个线程创建资源,另一个消费资源)。java.util.concurrent包下的BlockingQueue接口是一个线程安全的可用于存取对象的队列。

【译】使用阻塞队列解决生产者

BlockingQueue是一种数据结构,支持一个线程往里存资源,另一个线程从里取资源。这正是解决生产者消费者问题所需要的,那么让我们开始解决该问题吧。

使用BlockingQueue解决生产者消费者问题

生产者

以下代码用于生产者线程

package cn.edu.hdu.chenpi.cpdemo.howtodoinjava;import java.util.concurrent.BlockingQueue;class Producer implements Runnable {  protected BlockingQueue<Object> queue;  Producer(BlockingQueue<Object> theQueue) {    this.queue = theQueue;  }  public void run() {    try {      while (true) {        Object justProduced = getResource();        queue.put(justProduced);        System.out.println("Produced resource - Queue size now = "            + queue.size());      }    } catch (InterruptedException ex) {      System.out.println("Producer INTERRUPTED");    }  }  Object getResource() {    try {      Thread.sleep(100); // simulate time passing during read    } catch (InterruptedException ex) {      System.out.println("Producer Read INTERRUPTED");    }    return new Object();  }}

从输出结果中,我们可以发现队列大小永远不会超过20,消费者线程消费了生产者生产的资源。

 

译文链接:http://howtodoinjava.com/algorithm/producer-consumer-problem-using-blockingqueue/


原标题:【译】使用阻塞队列解决生产者

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录