出于某种原因,这个输出:
public void msgNeedParts() {
// Blabla...
System.out.println(name + ": Try to print 'tasks'...");
synchronized(tasks) {
System.out.println(name + ": Tasks--" + tasks);
System.out.println(name + ": Did I manage to print it?");
tasks.add(new BinToDump(feeder, binNum));
}
stateChanged();
}
只打印出“GantryAgent: Try to print 'tasks'...”,但不会打印以下任何消息。我猜测线程在尝试访问同步列表“任务”时会以某种方式“卡住”,但我不知道为什么会这样。
'tasks' 的声明和初始化如下:
private List<BinToDump> tasks =
Collections.synchronizedList(new ArrayList<BinToDump>());
谁能指出我错过了什么?
啊! 我怀疑我可能有罪魁祸首:
/* If nothing left to do, return to original position. */
synchronized (tasks) {
if (tasks.isEmpty()) {
doReturnToOriginalPos();
}
}
在我的调度程序(这是一个代理设计)中,我检查“任务”是否为空,然后调用 doReturnToOriginalPos()。也许这只是一次又一次地发生得太快以至于其他方法没有机会修改它?
这确实是问题所在!它在我的调度程序中一直被调用得如此之快,以至于没有其他东西可以访问“任务”。感谢大家的帮助!