2017-08-29 16 views
-1

Runnableが定義されたFlashというクラスがあります。同じRunnableから別のスレッドインスタンスを正しく作成するにはどうすればよいですか?

class Flash 
{ 
Runnable slow = new Runnable(){ 
    public void run(){ 
      //Do stuff here 
     } 
    } 
}; 
Thread slowThread = null; //Just declared a Thread variable 

//more stuff here 

} 

今、私は実行可能slowを使用して、新しいスレッドクラスのオブジェクトを作成しますblinkslow()という名前のメソッドがあります。それは設定し、今、run()方法は、その最後の文では、その仕事を終えるとき

void blinkSlow() 
{ 
    if(!threadRunning) //Boolean to make sure the thread is not running(works fine) 
    { 
     slowThread=null; 
     slowThread = new Thread(slow); 
     slowThread.start(); 
     threadRunning = true; 
    } 

} 

をこのブール値フラグthreadRunningをfalseに設定して終了します。

次に、メソッドblinkslow()を呼び出すと、スレッドは実行されません。なぜこうなった? 私が作ったことを確認してください:スレッドはすなわち、再びblinkshow()メソッドを呼び出す前に、そのrun()方法を完了停止した

  • slowThread = new Thread(slow);というステートメントは、呼び出されるたびにRunnableでThreadクラスの新しいインスタンスを作成するので、同じスレッドを再起動しようとしていません。

実行可能ファイルの別のインスタンスを最初に実行終了した後で再作成するにはどうすればよいですか?私が上でやったことは、二度目には働いていないし、私は理由もない。

+1

'threadRunning'の宣言がありません。クラスインスタンスですか?私は、この変数が実行後に正しくfalseに設定されていないと思われます。 – Xvolks

+0

'slowThread.start();と' threadRunning = true;をスワップします。 'start()'を呼び出すと、その時点までの変数に対する他のすべての変更に対して「発生前」の関係が作成されます。 'returns – Ferrybig

+0

@Xvolksこのフラグは、このRunnableのすぐ上にある同じ' Flash'クラスで宣言されます。今までの私のコードはかなりシンプルで、起こることはあまりなく、このフラグが設定され、正しく動作することを確認しました。 –

答えて

0

私が間違っていたことを考え出したばかりで、今はばかげています。 runメソッドの中に別のフラグstop(ブーリアン変数)がありました。私は最初の実行後にそれを解除することを忘れました。

私がいない限り、上記のコードは問題なく正常に動作します。

-2

スレッドがフンズされると、彼は「死んだ」状態になり、もはや使用できなくなります。 runメソッドを使用するには、スレッドオブジェクトの新しいインスタンスを作成する必要があります。

+0

そのため、スレッドのたびに 'Runnable'変数' slow'を何度か宣言しなければなりませんか? –

+1

このコード例は、 'Thread'オブジェクトを再利用しようとする試みを示しておらず、' Runnable'オブジェクトを再利用できない理由はありません。 –

関連する問題