我在用java多線程,在一個例子很好地說明一些問題:的Java多線程同步問題
class Thread1 extends Thread
{
boolean val=false;
public void set()
{
val=true;
}
public void run()
{
while (true)
{
if(val==true)
{
System.out.println("true");
val=false;
}
try
{
sleep(1);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
所以這是它在一個單獨的線程運行一個簡單的類。
現在考慮這種情況下: 1)我從其他線程啓動線程類中的上述 2)我所說的Thread1.set()
功能 3)條件的Thread1.run()函數的計算結果爲真
現在,事情是,如果我從上面的代碼中刪除睡眠(1),這個條件永遠不會設置爲true。
所以我的問題是:有沒有其他方式可以中斷run()函數,以便 其他函數可以設置將在run()函數內部使用的變量? (我正在Android上製作遊戲,因此openGL渲染器在一個線程中運行,而我的遊戲邏輯線程將在另一個線程中運行,並且我希望將它們同步到每一幀或兩幀),
是讓它變成只是衆多解決方案之一,但也許你可以解釋爲什麼這實際上起作用,爲什麼thread.sleep()似乎也對結果有一些影響。 –
我可以解釋易失性部分。 'volatile'在兩個線程之間建立一個「與...同步」的關係。如果線程T1看到線程T2在某個易失性變量上寫入的值,那麼可以保證T1將看到T2所做的所有以前的寫入,包括那些寫入非易失性變量的寫入。我已經看到一些人說,如果T2在T1嘗試讀取之前寫入一個易失性變量,T1將總是讀取T2寫入的值,但我認爲這不是真的(我想對此做一些澄清: - )。關於'睡眠'的影響,擊敗我! –