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 waitsandの代わりに、次の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();
}