困扰很久的java多线程问题,求教

「已注销」 2017-06-28 12:44:39
请教csdn众犇,我最近在做一个消息队列,主线程有一个newScheduleThreadPool负责执行周期性的socket accpet检查任务和队列持久化任务。
如果收到accept就会使用newCahcedThreadPool进行消息解析,消息入队,消息检验等操作,但是我现在有个很诡异的事情,每次队列有100个消息,持久化最多只能作用于几个(<5),然后队列就空了,求教这可能是哪方面的问题

ps:断点显示消息队列等正常,甚至到writeObject flush也是正常,但居然没有向磁盘写文件

下面是核心的snippet code

public void handleRequest(){
//work well
mainThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("In socket waiting");
Socket socketTask = null;
try {
socketTask = serverSocket.accept();
dispatcher.dispatch(socketTask);
} catch (SocketTimeoutException e){
System.out.println("Accept timeout");
} catch (IOException e) {
e.printStackTrace();
}
}
}, 3, 10, TimeUnit.MILLISECONDS);
//surprise
mainThreadPool.scheduleAtFixedRate(dispatcher.tmqManager.new PersistenceTask(), 2, 10, TimeUnit.MILLISECONDS);
}

class PersistenceTask implements Runnable{
@Override
public void run(){
synchronized (this) {
System.out.println("In persistence task");
Message messageObject = findMaxLengthQueue().pop();
if (messageObject != null) {
long epoch = System.currentTimeMillis() / 1000;
ObjectOutputStream outputStream = null;
try {
outputStream = new ObjectOutputStream(new FileOutputStream("msg" + epoch));
outputStream.writeObject(messageObject);
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
logger.warning("failure to persist message object");
}
}
}
}
}

...全文
256 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
BenCheney 2017-06-28
  • 打赏
  • 举报
回复
...........

62,628

社区成员

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

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