だから私はスレッドを含むJavaプログラムを書こうとしてきました。これは基本的に、スレッドが共有メモリリソース(以下のコードのセルクラス)に移動の許可を求める場合に問題になります。スレッド内のコードの例を示します。セルクラスの前述の3つのメソッドは同期メソッドですが、待機または通知を実装していません。
public void run() {
try{
while(true){
Random r = new Random();
Thread.sleep(r.nextInt(1000));
//asks the class cell permission to move if the cell is free.
if(cell.asksAccess(xi, yi, xf, yf)){
cell.releaseCell(xi, yi); //release the previous cell
move(); // move the object
cell.blockCell(xi, yi); // blocks the cell where the object is now staying.
setChanged();
notifyObservers();
}
}
} catch (InterruptedException e) {
}
}
private void move() {
int dx = xf - xi;
int dy = yf - yi;
xi += (int) Math.signum(dx);
yi += (int) Math.signum(dy);
}
前に言ったように、呼び出されるすべてのセルクラスメソッドは同期されます。私の問題は、これが期待どおりに機能していないことです。デバッグするためにsysoutを実行すると、スレッドが常に前進しているとは限らず、スレッドが最初の場所に戻ってしまうこともあり、その理由がわかりません。なぜなら、moveメソッドは常に前進し、決して後退しないように指示するからです。これはセルクラスとの同期の問題ですか?それとも移動方法ですか?どんな助けでも大歓迎です。