2016-03-23 12 views
0

実行しているRunnableを作成しようとしていますが、Runnableが行っている作業を一時停止または再開するために、外部から変数を変更する必要があります。Runnable内の変数を更新するにはどうすればよいですか?

これは私のRunnableを実装したものです:私は、アクティブの「揮発性」修飾子を試してみたが、それでもそれはないでしょう

Thread thread = new Thread(myRunnable); 
thread.run(); 
myRunnable.setActive(false); //This does not work!!! 
           //The boolean remains true inside myRunnable. 

:私は呼んで私のメインクラスで

private boolean active = true; 


public void run() { 
    while (true) { 
     if (active) { //Need to modify this bool from outside 
      //Do Something 
     } 
    } 
} 

public void setActive(boolean newActive){ 
    this.active = newActive; 
} 

更新。どんなアイデアも大歓迎です。

答えて

3
Thread thread = new Thread(myRunnable); 
thread.run(); 
myRunnable.setActive(false); 

3行目は、run()メソッドが返された後にのみ実行されます。すべてを1つのスレッドで順番に実行しています。 2行目は

thread.start(); 

である必要があります。フィールドはvolatileでなければなりません。

ただし、アクティブフィールドをfalseに設定すると、スレッドは何もしないでビジーループに入りますが、ループすることでCPUを消費します。再開するまでロックを使用して待機する必要があります。

+0

ありがとうございました。それを解決した。待機するロック機能はどのように実装しますか? – RoadkillMike

+0

たとえば、[条件](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.html)を使用します。 –

関連する問題