次のようにブール値が変化するのを待つスレッドがあります。
while(!value)
{
Thread.sleep(1000)
}
// Do some work after change of the value
これは、大量の CPU 消費の原因となるため、私が好む方法ではありません。
ブール値が状態を変えるまで、スレッドをブロックする方法はありますか?
次のようにブール値が変化するのを待つスレッドがあります。
while(!value)
{
Thread.sleep(1000)
}
// Do some work after change of the value
これは、大量の CPU 消費の原因となるため、私が好む方法ではありません。
ブール値が状態を変えるまで、スレッドをブロックする方法はありますか?
これは、大量の CPU 消費の原因となるため、私が好む方法ではありません。
それが実際に機能するコードである場合は、そのままにしておいてください。ブール値を 1 秒に 1 回チェックしても、測定可能な CPU 負荷は発生しません。何もありません。
本当の問題は、値をチェックするスレッドが、キャッシングのために任意に長い間発生した変更を認識できない可能性があることです。値がスレッド間で常に同期されるようにするには、変数定義に volatile キーワードを入れる必要があります。
private volatile boolean value;
synchronized
他の回答で説明されている通知ベースのソリューションを使用する場合など、アクセスをブロックに入れると同じ効果があることに注意してください。
ビジー待機を回避するメカニズムが必要です。古いwait/notify
メカニズムには落とし穴がたくさんあるので、次のようなjava.util.concurrent
ライブラリの何かを優先してCountDownLatch
ください:
public final CountDownLatch latch = new CountDownLatch(1);
public void run () {
latch.await();
...
}
そして向こう側の電話で
yourRunnableObj.latch.countDown();
ただし、必要になるまで待機するだけでスレッドを開始することは、依然として最善の方法ではありません。ExecutorService
条件が満たされたときに実行する必要がある作業をタスクとしてサブミットする を使用することもできます。
わかりました多分これはあなたの問題を解決するはずです。変更を行うたびに、待機を解放する change() メソッドを呼び出すことに注意してください。
Integer any = new Integer(0);
public synchronized boolean waitTillChange() {
any.wait();
return true;
}
public synchronized void change() {
any.notify();
}
私はそのような場合にミューテックスメカニズムを使用することを好みますが、本当にブール値を使用したい場合は、(スレッド間で変更の可視性を提供するために) 揮発性として宣言し、そのブール値を条件としてボディレスサイクルを実行する必要があります:
//.....some class
volatile boolean someBoolean;
Thread someThread = new Thread() {
@Override
public void run() {
//some actions
while (!someBoolean); //wait for condition
//some actions
}
};