所以我一直在試圖編寫一個java程序,涉及線程。這基本上是一個線程詢問共享內存資源(下面的代碼中的單元類)是否允許移動的問題。我將向您展示線程中的代碼示例。從cell類中提到的三種方法是同步方法,但是它們不實現等待或通知。線程管理
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調試時,它顯示線程並不總是前進,有時甚至會回到他們開始時的位置,我不明白爲什麼因爲移動方法總是告訴他們前進並永不回頭。這是與單元類同步的問題嗎?或者它是移動方法?任何幫助將不勝感激。
我懷疑你是不是同步數據,以便所有線程都在讀/寫單元的本地varions或者其他的東西。很難告訴所示的代碼。 – Gray
您應該將'Random'移到while外面,並在Thread.sleep(...);'周圍移動InterruptedException。哦,並且總是至少打印'InterruptedException'並重新中斷該線程。 – Gray
線程被授予訪問單元的權限是100%,然後在執行if塊中的任何步驟之前產生控制權。你需要同步整個'外部'邏輯塊。 – Perception