关于java多线程的问题 每收到一个信息就要创建一个线程,放到指定的存储区域内,另外还用一个线程负责从存储区域内读数据并显示出来,这个如何出来啊?大侠们指点一下。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不知道你想干什么。你描述是一种典型的多线程模型,你所谓的存储区域其实就是一个队列(如LinkedList),一头往队列里放数据,另一头从队列里取数据然后处理,批次间进行阻塞。 你这个是典型的线程同步问题,有多个线程和一个临界资源,那就肯定要实现同步,也就是说在一个线和访问这个临界资源的时候另外的线程只能等待,或者说这是一个生产者和消费者的问题(操作系统里有P-V操作来实现同步和互斥,JAVA里也有同步的机制),几个线程当生产者,一个线程当消费者,你可以用同步的方法进行互斥写,一个写完了唤醒另外一个等待写的线程。具体你可参考JAVA核心技术卷二或在网上找一下。这方面的资料很多。 你的问题是一个数据仓库的问题,也叫生产者、消费者问题。生产者生产产品放入仓库中,消费者从仓库中取数据。 生产者: public void run() { //获取生产者锁 synchronized(product.getSLock()) { //检查队列长度是否超过最大长度,如果是,则等待 while(product.size() >= product.getMaxPNum()) { try { product.getSLock().wait(); } catch (InterruptedException e) { continue; } } } //生产产品,并存入产品仓库中 productObj = trans.transactForSupplier(neObj); if(productObj == null) { continue; } product.offer(productObj); //通知消费者对象,可以进行消费了 synchronized(product.getCLock()) { product.getCLock().notifyAll(); } /* * 通知仓库没有商品可生产了, 设置关闭状态. */ product.setClose(true); } 消费者: public void run() { Object productObj = null; while(isRunning) { //获取消费者锁 synchronized(product.getCLock()) { //检查产品列队中是否有数据,如果没有,就等待 while(product.size() <= 0) { try { product.getCLock().wait(); } catch (InterruptedException e) { continue; } } //从产品仓库中获取产品,并对产品做处理 productObj = product.peek(); trans.transactForConsumer(productObj); } //通知生产者进行生产 synchronized(product.getSLock()) { product.getSLock().notifyAll(); } } if(product.getClose()) { isRunning = false; } }仓库类: public class ProductStorage { /** * 构造函数 */ public ProductStorage() { } /** * 获取消费者锁 * @return */ public byte[] getCLock() { return cLock; } /** * 获取生产者锁 * @return */ public byte[] getSLock() { return sLock; } /** * 获取列队的最大长度 * @return */ public int getMaxPNum() { return maxPNum; } /** * 设置列队最大长度 * @param maxPNum */ public void setMaxPNum(int maxPNum) { this.maxPNum = maxPNum; } public List getProduceList() { return produceList; } /** * 获取队列的长度 * @return */ public int size() { synchronized(produceList) { return produceList.size(); } } /** * 获取队列中第一个对象,并从队列中清除该对象 * @return */ public Object peek() { synchronized (produceList) { if (this.produceList.isEmpty()) return null; return this.produceList.remove(0); } } /** * 往队列中写入一个对象 * @param o * @return */ public boolean offer(Object o) { synchronized (produceList) { return this.produceList.add(o); } } /** * 设置关闭标志 * @param flag */ public void setClose(boolean flag) { this.close = flag; } /** * 获取关闭标志 * @return */ public boolean getClose() { return this.close; } /** * 关闭标志, 各个生产者和消费者线程发现该标志为"true"时, 各自都将退出线程. */ private boolean close = false; /** * cLock 消费锁,每个消费者只有获取该锁才能进入消费流程 */ private byte [] cLock = new byte[0]; /** * pLock 生产锁,每个生产者只有获取该锁才能进入生产流程 */ private byte [] sLock = new byte[0]; /** * produceList 产品存放的队列 */ private List produceList = new LinkedList(); /** * maxPNum 产品能存放的最大数量 */ private int maxPNum = 50;} java中@的使用问题? java技术群13134848,拒绝初学者。大家尽情的讨论和学习、帮助 这个小applet程序可以编译通过,就是在运行时候报错 问两个UI设计的简单问题 打印置换字符串的问题 托盘程序及消息提示、闪动 jar打包出错 Apache Soap问题,能正确部署Service,确始终不能调用! 在JBUILDER4中作的APPLET肯定在IE5内不能用吗,用插件后能用吗? 如何为数字加千分位 java 类继承的问题 显示三个面板问题...
数据。 生产者: public void run() {
//获取生产者锁
synchronized(product.getSLock()) {
//检查队列长度是否超过最大长度,如果是,则等待
while(product.size() >= product.getMaxPNum()) {
try {
product.getSLock().wait();
} catch (InterruptedException e) {
continue;
}
}
}
//生产产品,并存入产品仓库中
productObj = trans.transactForSupplier(neObj);
if(productObj == null) {
continue;
}
product.offer(productObj);
//通知消费者对象,可以进行消费了
synchronized(product.getCLock()) {
product.getCLock().notifyAll();
}
/*
* 通知仓库没有商品可生产了, 设置关闭状态.
*/
product.setClose(true); }
消费者: public void run() {
Object productObj = null;
while(isRunning) {
//获取消费者锁
synchronized(product.getCLock()) {
//检查产品列队中是否有数据,如果没有,就等待
while(product.size() <= 0) {
try {
product.getCLock().wait();
} catch (InterruptedException e) {
continue;
}
}
//从产品仓库中获取产品,并对产品做处理
productObj = product.peek();
trans.transactForConsumer(productObj);
}
//通知生产者进行生产
synchronized(product.getSLock()) {
product.getSLock().notifyAll();
}
}
if(product.getClose()) {
isRunning = false;
}
}
仓库类:
public class ProductStorage {
/**
* 构造函数
*/
public ProductStorage() {
} /**
* 获取消费者锁
* @return
*/
public byte[] getCLock() {
return cLock;
} /**
* 获取生产者锁
* @return
*/
public byte[] getSLock() {
return sLock;
} /**
* 获取列队的最大长度
* @return
*/
public int getMaxPNum() {
return maxPNum;
} /**
* 设置列队最大长度
* @param maxPNum
*/
public void setMaxPNum(int maxPNum) {
this.maxPNum = maxPNum;
} public List getProduceList() {
return produceList;
} /**
* 获取队列的长度
* @return
*/
public int size() {
synchronized(produceList) {
return produceList.size();
}
} /**
* 获取队列中第一个对象,并从队列中清除该对象
* @return
*/
public Object peek() {
synchronized (produceList) {
if (this.produceList.isEmpty())
return null;
return this.produceList.remove(0);
}
} /**
* 往队列中写入一个对象
* @param o
* @return
*/
public boolean offer(Object o) {
synchronized (produceList) {
return this.produceList.add(o);
}
}
/**
* 设置关闭标志
* @param flag
*/
public void setClose(boolean flag) {
this.close = flag;
}
/**
* 获取关闭标志
* @return
*/
public boolean getClose() {
return this.close;
}
/**
* 关闭标志, 各个生产者和消费者线程发现该标志为"true"时, 各自都将退出线程.
*/
private boolean close = false; /**
* cLock 消费锁,每个消费者只有获取该锁才能进入消费流程
*/
private byte [] cLock = new byte[0];
/**
* pLock 生产锁,每个生产者只有获取该锁才能进入生产流程
*/
private byte [] sLock = new byte[0];
/**
* produceList 产品存放的队列
*/
private List produceList = new LinkedList();
/**
* maxPNum 产品能存放的最大数量
*/
private int maxPNum = 50;
}