2012-10-06 37 views
2

看着幾款Android例子我看到線程使用join()方法暫停的趨勢:爲什麼的Thread.join通常用於停止線程的Android

編輯:請假設2個線程正確定義。編輯調用join()方法

public class MainUI extends Activity{ 
    private GraphicsViewThread g; 
    private BackendDataViewThread b; 

    void onCreate(){ 
     g = new GraphicsViewThread(); 
     g.start(); 
     b = new BackendDataViewThread(); 
     b.start(); 
    } 
    . 
    . 
    . 
    void pauseGame(){ 
     try { 
     g.join(); 
     }catch (InterruptedException e){ 
     e.printStackTrace(); 
     } 
     try { 
     b.join(); 
     }catch (InterruptedException e){ 
     e.printStackTrace(); 
     } 
     GraphicsViewThread = null; 
     BackendDataViewThread = null; 
    } 
} 
  1. 哪個線程不GraphicsViewThread和BackendDataViewThread加盟?
  2. 使用join()需要什麼?我可以不立即將參考設置爲空嗎?
+0

是否編譯過? –

+0

@LewsTherin否,它不會編譯。我添加了一種僞代碼來顯示我在問什麼。對不起,如果我沒有說清楚 – user571099

回答

4

我懷疑你的代碼不能編譯,但不管 - 我會回答。
這不僅僅是關於Android,而是簡單的Java。
使用「連接」可確保您的代碼將等待線程結束。
這不正是你想要的嗎?
另外,不要將線程的引用設置爲null。
您無法確切地確定線程何時結束,因此在線程對象結束之前將線程對象設置爲空將是不好的做法。

0

這是一個集合函數,這意味着您引用的線程(例如GraphicsViewThread)將在該點(它永遠會先到達那裏)加入父/主/ UI線程。這是實際繪製UI的線程。您不能只將參考設置爲空,因爲它只是一個參考。該任務仍將在後臺工作。

就我所使用的Android而言,我已經學會了避免使用線程。使用AsyncTask或其他類似的容器。它更可管理。

編輯: 我剛剛注意到,正如其他人提到的,您的代碼不正確,它可能無法正常工作。

0

代碼中有幾處錯誤,並且對Thread.join的用途感到困惑。必須在Thread的實例上調用join方法。所以你想打電話給gb加入。在你打電話給加入之前,你通常必須以某種方式通知那些你希望他們停下來的線索。正如zaske提到的,join將在調用pauseGame的線程繼續執行之前等待該線程完成。