2

いくつかの Android の例を見ると、join() メソッドを使用してスレッドが一時停止される傾向が見られます。

編集: 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() を使用する必要性は何ですか? 参照をすぐに null に設定することはできませんか?
4

3 に答える 3

5

あなたのコードはコンパイルされていないと思いますが、それでも答えます。
これは Android だけの問題ではなく、単純な Java の問題です。
「結合」を使用すると、コードがスレッドの終了を待機するようになります。
これはまさにあなたが望むものではありませんか?
また、スレッドの参照を null に設定しないでください。
スレッドがいつ終了するかを正確に保証することはできないため、終了する前にスレッド オブジェクトを null に設定することはお勧めできません。

于 2012-10-06T16:41:44.107 に答える
0

これはランデブー関数です。つまり、参照しているスレッド (GraphicsViewThread など) は、その時点で親/メイン/UI スレッドに参加します (最初に到達した方)。それが実際に UI を描画しているスレッドです。単なる参照であるため、参照を null に設定することはできません。タスクは引き続きバックグラウンドで実行されます。

私が Android で作業し、それを分析した限り、スレッドを避けることだけを学びました。AsyncTask または他の同様のコンテナーを使用します。それははるかに管理しやすいです。

編集: 他の人が述べたように、コードが正しくないことに気付きました。おそらく機能しません。

于 2012-10-06T16:42:08.337 に答える
0

コードにいくつかの間違いがあり、 の目的について混乱していThread.joinます。メソッドはのjoinインスタンスで呼び出す必要がありますThread。したがって、 join と を呼び出す必要がgありbます。join を呼び出す前に、通常は何らかの方法でこれらのスレッドを停止するように通知する必要があります。zaske が言及しているように、joinそのスレッドが完了するまで待機してから、呼び出し元のスレッドで実行を続行しますpauseGame

于 2012-10-06T16:43:47.677 に答える