日期:2014-05-20  浏览次数:20693 次

多线程问题,求大神指点
本帖最后由 zhji123 于 2013-04-25 18:48:50 编辑
做了一个网络程序,底层用的是mina

有一个

public class MessageDispatcher {

private final Logger log = LoggerFactory.getLogger(MessageDispatcher.class);

public MessageDispatcher() {
messageQueue = new ArrayBlockingQueue<String>(2048);


}
private BlockingQueue<String> messageQueue;



public int putMessage(String packet) {

try {
messageQueue.put(packet);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return 0;
}

public String getMessage() {
try {
String packet = messageQueue.take();
log.info("get message queue size:"+messageQueue.size());
return packet;
} catch (InterruptedException e) {
log.error("get message error:" + e.getMessage());
}
return null;
}
}

Mina 的client 收到到消息调用putMessage 方法
然后又一个消息处理类


public class ServiceSkeleton {

private final Logger LOG = LoggerFactory.getLogger(ServiceSkeleton.class);
private MessageThread messageThread;

public ServiceSkeleton(MessageDispatcher dispatcher) {
this.dispatcher = dispatcher;


}

public void start() {
messageThread=new MessageThread(dispatcher,this);
messageThread.start();
}

public void onMessage(String packet) {
System.out.println(packet);
}
private MessageDispatcher dispatcher;
}
class MessageThread extends Thread {
private final Logger LOG = LoggerFactory.getLogger(MessageThread.class);
boolean runFlag=true;
public MessageThread(MessageDispatcher dispatcher,ServiceSkeleton sk){
this.dispatcher=dispatcher;
this.sk=sk;
}
MessageDispatcher dispatcher;
ServiceSkeleton sk;
synchronized void setRunFlag(boolean flag){
this.runFlag=flag;
}
@Override
public void run() {
while (true) {
LOG.info("get message from dispatcher!");
String msg = dispatcher.getMessage();
if (null != msg) {
try{
sk.onMessage(msg);
}catch(Exception e){
LOG.error("handler message error({})",e.getMessage());
}
}
}
}

}


这个类是处理消息的有多个实例,当消息量比较大的时候,不知道为什么会 ,Dispatcher队列里满了才会执行getMessage方法

------解决方案--------------------
太高深了 看不懂啊 帮楼主定一个!
------解决方案--------------------
messageQueue = new ArrayBlockingQueue<String>(2048);
创建一个带有给定的(固定)容量和默认访问策略的 ArrayBlockingQueue