producer consumer
来源:互联网 发布:软交换网络结构 编辑:程序博客网 时间:2024/04/28 23:36
Mark......
public class ProducerConsumer {private LinkedBlockingQueue<DBObject> _queue = new LinkedBlockingQueue<DBObject>(1000);private final Lock _lock = new ReentrantLock();private DBCollection _coll = null;private volatile DBCursor _cur = null;private int _producers;private int _customers;private volatile boolean _producerRunning = false;private volatile boolean _finishedConsume = false;private AtomicInteger _finishedProducers = new AtomicInteger(0);private AnswerScorers scorers = new AnswerScorers("", -5000, 10000);public ProducerConsumer(DBCollection coll, int producers, int customers) {this._coll = coll;this._producers = producers;this._customers = customers;}/** * 另外一种串行获取数据的方式。 * @return */private synchronized DBObject next() {if (!_cur.hasNext()) {return null;}return _cur.next();}public void start() {this._cur = _coll.find();_producerRunning = true;_finishedProducers.set(0);for (int i = 0; i < _producers; i++) {new Producer().start();}for (int i = 0; i < _customers; i++) {new Consumer().start();}try {while (!_finishedConsume) {Thread.sleep(1000);}} catch (InterruptedException e) {e.printStackTrace();}}/** * 生产一条数据,放在数据队列。 * @author xiuleili * */class Producer extends Thread {public void run() {int count = 0;try {while (true) {// DBObject dbo = next();// this code has the same effect with next lines:DBObject dbo = null;_lock.lock();if (_cur.hasNext()) {dbo = _cur.next();}_lock.unlock();if(dbo == null){break;}count++;AnswerNLP answer = buildAnswerNlpFromDBO(dbo);int score = scorers.score(answer);dbo.put("score", new Integer(score));_queue.put(dbo);}} catch (Exception e) {} finally {System.out.println(Thread.currentThread().getName() + " total produced " + count);if (_finishedProducers.addAndGet(1) == _producers) {_producerRunning = false;}}}}/** * 消费一条数据,写入数据库。 * @author xiuleili * */class Consumer extends Thread {public void run() {int count = 0;while (_producerRunning || !_queue.isEmpty()) {try {// 取出一个对象DBObject dbo = _queue.poll(300, TimeUnit.MILLISECONDS);if (dbo == null) {continue;}DBObject query = new BasicDBObject("answerId", dbo.get("answerId"));DBObject update = new BasicDBObject("$set", new BasicDBObject("score", dbo.get("score")));_coll.update(query, update);count++;} catch (InterruptedException e) {System.out.println("producer is interrupted!");}}System.out.println(Thread.currentThread().getName() + " total consumed " + count);_finishedConsume = true;}}}/** * 使用多线程的方法进行操作。多个生产者进行分析,多个个消费者进行数据库写。 */public static void scoreAnswersThreads() {DBCollection coll = MongoDriver.getCollection("mongodb://10.13.95.60/test.answerNLP");new DBDataManage().new ProducerConsumer(coll, 10, 2).start();}
0 0
- producer consumer
- producer & consumer
- The Producer-Consumer Problem
- compile producer-consumer
- ProtoThreads - Producer&Consumer
- ACE_Task Consumer-Producer
- Producer-consumer problem
- Producer Consumer 模式
- Producer-Consumer Pattern
- Producer-Consumer Pattern
- Semaphore Consumer-Producer Code
- BufferQueue/consumer/producer
- Producer-Consumer 生产者,消费者
- ZeroMQ with producer-consumer
- Fresco深入--- Producer && Consumer
- Java Thread Producer/Consumer
- Producer/Consumer Model(pthread)
- Python producer & consumer model
- fdhzshshsdfhdfh
- 配置Spring的用于解决懒加载问题的过滤器
- memo:liferay-service-builder_6_2_0.dtd
- fck解决办法
- Maven最佳实践:划分模块
- producer consumer
- 弹出模式
- C语言中extern的用法(转摘
- 算法 拓扑排序
- 右键菜单修改和调整(注册表)
- EXP-00091和IMP-00010解决办法
- Uva 10883 - Supermean 解题报告(对数)
- zabbix部署proxy
- 秒杀的架构