您的位置:首页 > 编程语言 > Java开发

【Java】并发之阻塞队列

2014-02-20 00:43 357 查看
BlockingQueue 方法以四种形式出现,对于不能立即满足但可能在将来某一时刻可以满足的操作,这四种形式的处理方式不同:第一种是抛出一个异常,第二种是返回一个特殊值(null 或 false,具体取决于操作),第三种是在操作可以成功前,无限期地阻塞当前线程,第四种未成功则阻塞,直到指定时间就放弃。下表中总结了这些方法:

抛出异常特殊值阻塞超时
插入add(e)offer(e)put(e)offer(e, time, unit)
移除remove()poll()take()poll(time, unit)
获取element()peek()不可用不可用
BlockingQueue主要用于“生产者-消费者”的场景,这里,我们可以简化上文中的程序代码,如下:

class Factory2 {

private BlockingQueue<String> queue = new LinkedBlockingQueue<String>(100);

/**
* 生产1个产品
*/
public void produce() {
queue.offer("XXX");
}

/**
* 卖出1个产品
*/
public void consume() {
try {
queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

在多线程程中分别调用produce()和consume()方法,同样可以确保生产与销售的协调进行,生产不会让库存超过100,而销售不会卖出剩下负数的产品。

大家注意到,这里上述代码中没有看到Lock和Condition控制代码了。其实,是放在BlockingQueue实现类里实现了Lock和Condition。

@容新华技术博客 - http://blog.csdn.net/rongxinhua -
原创文章,转载请注明出处
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息