多线程问题,求大神指点

zhji123 2013-04-25 06:47:30
做了一个网络程序,底层用的是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方法
...全文
65 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
oh_Maxy 2013-05-17
  • 打赏
  • 举报
回复
messageQueue = new ArrayBlockingQueue<String>(2048); 创建一个带有给定的(固定)容量和默认访问策略的 ArrayBlockingQueue 这个默认的策略,应该是满了之后,再次put时,才需要take移除操作的吧。
关键我是洛哥 2013-05-17
  • 打赏
  • 举报
回复
太高深了 看不懂啊 帮楼主定一个!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧