スレッドは別のクラスに基づいて他のスレッドによって作成された同じ変数を使用しているため、スレッドで作業していて問題があります。 問題は、このコードを使用することです:Javaで同じ変数を使用するスレッド
public void run() {
int cityID = 0;
int requestID = 0;
boolean inBase = true;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
while (inBase == true) {
for (cityID = 0; cityID < world.getCities().size(); cityID++) {
if ((!world.getCities().get(cityID).getRequestsList().isEmpty()) && (inBase == true)) {
for (requestID = 0; requestID < world.getCities().get(cityID).getRequestsList()
.size(); requestID++) {
if (world.getCities().get(cityID).getRequestsList().get(requestID).isRequest() == true) {
world.getCities().get(cityID).getRequestsList().get(requestID).setRequest(false);
System.out.println(Thread.currentThread().getName() + " is flying to "
+ world.getCities().get(cityID).getName());
inBase = false;
break;
}
}
}
}
}
}
結果は次のとおりです。
City 859|342 is sending request for airplane. . .
City 328|669 is sending request for airplane. . .
City 718|287 is sending request for airplane. . .
Airplane kS-2 is flying to City 859|342
Airplane kS-1 is flying to City 859|342
あなたは飛行機が同じ市に飛んでいるし、それは間違って見るように。私はすでに行っているので、 は条件
if world.getCities().get(cityID).getRequestsList().get(requestID).isRequest() == true)
、私はこのような状況を防ぐために何をすべきか分からないのです。そして、私は偽
world.getCities().get(cityID).getRequestsList().get(requestID).setRequest(false);
しかし、スレッドと同じ値を探しているのは、この値を変更します同時に、私ができることは、それぞれランダムな時間にスリープしてから、同じ時間に真の値をチェックすることはありませんが、無作為に私は2つの同じ値を得ることができるので、飛行機は同じターゲットに飛ぶことがあります。 私はそれを行うより良い方法があると思いますが、分かりません。助けてください。
新しい同期メソッドを作成することで簡単に簡単にできます。ありがとう:) – Vrangz