java生产者消费者
来源:互联网 发布:材料数据库 编辑:程序博客网 时间:2024/05/16 22:30
写了一个生产者消费者模式,但好像有数据不一致的问题,先记录下:
package com.itrip.rp.openapi;import java.util.ArrayList;import java.util.List;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class MyTest { public static void main(String[] args) { MessageQueue queue = new MessageQueue(); for(int i = 0; i<100; i++){ Producer producer = new Producer(queue); Thread tProducer = new Thread(producer); tProducer.start(); } Consumer c = new Consumer(queue); Thread tComsumer = new Thread(c); tComsumer.start(); }}class Message{int mId;String text;public Message(int id) {this.mId = id;}@Overridepublic String toString() {return "Message [mId=" + mId + ", text=" + text + "]";}}class MessageQueue{int index = 0;final int MAX_INDEX = 50;//消息的最大数public List<Message> messages = new ArrayList<Message>(); //生产消息 public synchronized void push(Message m){ while(getIndex()>MAX_INDEX){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notifyAll(); messages.add(m); setAddIndex(); } /** * 消费消息 * @return */ public synchronized Message pop(){ while(getIndex()==0){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notifyAll(); setSubIndex(); return messages.get(getIndex()); } public synchronized int getIndex(){ return index; } public synchronized void setSubIndex(){ this.index --; } public synchronized void setAddIndex(){ this.index ++; }}/** * 生产消息类 * @author cheng * */class Producer implements Runnable{ MessageQueue mq = null; Producer(MessageQueue ms){ this.mq = ms; } @Override public void run() { Message m = new Message(mq.getIndex() +1); mq.push(m); System.out.println("生产了id:"+m.mId+"消息"); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } }}/** * 消费消息类 * @author cheng * */class Consumer implements Runnable{ MessageQueue mq = null; public Consumer(MessageQueue ms) { this.mq = ms; } @Override public void run() { //当队列里还有消息,则启动新的线程池 while (mq.getIndex() >0) { ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5); for(int i = 0; i<5; i++){ if(mq.getIndex() >0){ fixedThreadPool.execute(new Runnable() {@Overridepublic void run() { Message m = mq.pop(); System.out.println("消费了消息:"+m); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }}}); }else{ break; } } fixedThreadPool.shutdown(); while(true){ if (fixedThreadPool.isTerminated()) { System.out.println("统一进行DB操作"); break; } } } }}
0 0
- java多线程 消费者-生产者
- java生产者 消费者问题
- java生产者消费者
- java生产者消费者
- Java生产者消费者问题
- java多线程 消费者-生产者
- java生产者消费者问题
- java 多线程 生产者消费者
- JAVA [ 多线程 -- 生产者消费者 ]
- Java 生产者消费者问题
- java 生产者消费者问题
- java 生产者和消费者
- Java生产者消费者问题 .
- [Java] 生产者&消费者问题
- Java生产者消费者代码
- java 生产者与消费者
- Java 生产者消费者问题
- 生产者消费者java实现
- ListView里的CheckBox使用
- Oracle聚簇表使用方针
- LeetCode459——Repeated Substring Pattern
- Activity的状态保存
- JSOUP选择器语法说明
- java生产者消费者
- 花相似,人不同—组长篇
- struts.properties核心文件
- Ubuntu Git安装与使用
- 用SVG制作 Button 点击特效实例
- Win7-64bit下matlab C混合编程环境搭建
- sklearn学习笔记3——pipeline
- vs2013+tesseract配置
- 联合查询中要注意要有索引