wait()
とnotify()
メカニズムを使用します。すべての Java オブジェクトはこれらのメソッドを所有しています。メカニズムは、何らかの条件が満たされるまでスレッドをブロックします。
たとえば、メイン スレッドが、result
変数の値を変更する別のスレッドを呼び出すとします。次に、他のスレッドに到達wait
するresult
まで、次のことができます。notified
private static StringBuilder result= new StringBuilder();
public static void mainThreadWork() {
new WorkerThread().start();
synchronized (result) {
System.out.println(result.toString()); //prints ""
result.wait();
System.out.println(result.toString()); //prints "modified"
}
}
private static class WorkerThread extends Thread {
@Override
public void run() {
synchronized(result) {
result.append("modified");
result.notify();
}
}
}
何が起こるか: スレッドがあるオブジェクトで を呼び出すwait
と、CPU が他のスレッドに渡され、(メソッド名が示すように) 別のスレッドがnotify
そのスレッドでシグナルを送信するのを待ちます。notify
そのオブジェクトを待っていたスレッドに CPU を譲ります。
たとえば、一部のルールは尊重する必要がwait()
あり、ブロックnotify()
内で呼び出す必要があります。synchronized
concurrent
Java 1.5 以降、より抽象的なレベルの同期と待機通知メカニズムがあるため、Java のライブラリを確認できます。より抽象的なオブジェクトのようなレベルでオブジェクトをロックして待機することができます。
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
したがって、synchronized
ブロック and waits
andの代わりに、次のnotifies
ようにすることができます。
public static void mainThreadWork() {
lock.lock();
new WorkerThread().start();
System.out.println(result.toString()); //prints ""
condition.await();
System.out.println(result.toString()); //prints "modified"
lock.unlock();
}
そしてでWorkerThread
:
@Override
public void run() {
lock.lock();
result.append("modified");
condition.singal();
lock.unlock();
}