2011-11-18 2 views
5

AnimationThread、このクラスを考えてみましょう:run()は一度呼び出されるのはなぜですか?

class AnimationThread implements Runnable { 
    public void pause() { 
     doAnimation = false; 
    } 

    public void doStart(){ 
     doAnimation = true; 
    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     if (doAnimation) { 
      //my code 
     } 

     try { 
      Thread.sleep(500); 
     } 
     catch (InterruptedException e) { 

     } 
    } 
} 

今私は(ちょうどラフなコードを示す)活動のonCreateでこのスレッドを始めています:

AnimationThread animRunnable = new AnimationThread(); 
animationThread = new Thread(animRunnable); 
animationThread.start(); 

しかしrun()、私はトレースさだけ(一度呼ばなっていますそれを確認するためのログ)。私はスレッドを開始したときに、なぜrun()が500スリープで繰り返し呼び出されていないのかを知りたいだけです。一度呼び出されるだけです。

答えて

12

することになっている方法です。

スレッドはrunメソッドを実行して実行します(1回だけ)。その後、完了/死亡/完了/完了とみなされます。

ループする場合は、自分で(runメソッド内で)実行するか、ExecutorServiceを使用してRunnableを繰り返し呼び出す必要があります。

+0

ありがとう。私は論理を得た。内部でロジックコードが繰り返し実行されていることを確認しています。実際に私の状況では私はrun()が私の目的のためにinfinetlyを実行したいので、doNnimation状態変数の状態に基づいてアニメーションが実行されている間、while(true)ありがとう。 –

+0

これは一般的なパターンです。しかし、おそらく、プログラムをシャットダウンするために、スレッドを最終的に終了させたいでしょう。または、デーモンスレッドを使用することもできます。 – Thilo

8

もちろん、run()メソッドは1回実行されます。 runメソッド内でステートメントを繰り返す場合は、ループを使用する必要があります。 TimerTaskを見てください - 指定された時間に、または繰り返してタスクを実行します。

EDIT:

  1. Android - Controlling a task with Timer and TimerTask?
  2. Timer task schedule
+0

ありがとうございます。あなたは私に例のリンクを見せてください。お願いします。 –

+1

@ user925224 - 投稿を編集しました。 – adatapost

+0

+1これまでにユーザーが求めたものを与える。 – ngesh

0

run()は、Threadで1回だけ実行される方法です。仕上げ後にrun methodスレッドはdead or completedです。
スレッド実行ではスレッドを強制終了したくない場合は、実行終了を確認する必要があります。

関連する問題