2011-08-01 127 views
0

我在用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渲染器在一個線程中運行,而我的遊戲邏輯線程將在另一個線程中運行,並且我希望將它們同步到每一幀或兩幀),

回答

4

如果只有一個線程(即讀取線程以外的線程)正在修改val,然後將其設置爲volatile

+0

是讓它變成只是衆多解決方案之一,但也許你可以解釋爲什麼這實際上起作用,爲什麼thread.sleep()似乎也對結果有一些影響。 –

+0

我可以解釋易失性部分。 'volatile'在兩個線程之間建立一個「與...同步」的關係。如果線程T1看到線程T2在某個易失性變量上寫入的值,那麼可以保證T1將看到T2所做的所有以前的寫入,包括那些寫入非易失性變量的寫入。我已經看到一些人說,如果T2在T1嘗試讀取之前寫入一個易失性變量,T1將總是讀取T2寫入的值,但我認爲這不是真的(我想對此做一些澄清: - )。關於'睡眠'的影響,擊敗我! –

3

您的布爾變量不是volatile這意味着不能保證兩個不同的線程看到相同的值。通過休眠虛擬機可能會導致從不同線程設置的值對線程可見(這只是一種猜測 - 沒有其他),但不應以任何方式依賴此行爲。根據您的需要,您應該使用volatile布爾變量或AtomicBoolean類。

+0

現在工作,因爲它應該,謝謝! – n3XusSLO