何らかの理由で、これの出力:
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'...」だけが出力されますが、次のメッセージは出力されません。同期されたリスト「タスク」にアクセスしようとすると、スレッドが何らかの形で「スタック」すると推測していますが、なぜこれが起こっているのかわかりません。
「タスク」は次のように宣言および初期化されました。
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() を呼び出します。たぶん、これは他の方法がそれを変更する機会を得られないほど速く何度も起こっているのでしょうか?
それは確かに問題でした!スケジューラーで非常に高速に呼び出され続けたため、他の何も「タスク」にアクセスできませんでした。助けてくれてありがとう!