ThreadB
からスレッドに通知を送信し、からThreadA
の通知を待機する機能があります。ThreadA
ThreadB
の間の期間中A
は によって通知されB
、次にB
によってデータがA
ThreadA
読み取られThreadB
、終了すると に通知が送信されThreadB
ます。
sendNotifyAndWaitNotify は ThreadB で実行されます。
同じオブジェクトで1つずつ同期するのは奇妙に見えるかもしれませんが、B.sync.notify();
同期ブロックを終了したときにのみ通知を送信し、1つのブロックにすべてを書き込む場合は、最初に待機し、同期ブロックを終了したときにのみ通知を送信します。それは受け入れられません。
void sendNotifyAndWaitNotify() {
synchronized(B.sync) {
B.sync.notify();
}
//ThreadA reads ThreadB data
synchronized (B.sync) {
try {
debug("start waiting for notify");
B.sync.wait();
} catch (Exception e) {
error( e.toString());
}
}
debug("reader sleep done");
}
しかし、この関数は正しくありません。なぜなら、ThreadB が待機を開始していない時点で、ThreadA はデータを読み取り、ThreadB に通知できるからです。次のような同期ブロックをまたいで問題を解決することは可能ですか:
void sendNotifyAndWaitNotify()
{
synchronized(B.sync) // block #1
{
synchronized(B.sync) // block #2
{
B.sync.notify();
}
//ThreadA reads ThreadB data
try
{
debug("start waiting for notify");
B.sync.wait();
} catch (Exception e) {
error( e.toString());
}
debug("reader sleep done");
}
}
同期ブロック #1 を終了した後、#2 ではなく ThreadA が起動されることを期待しています。そして、ブロック#2のコードは、おそらく2番目のブロックは別の同期オブジェクトで作成する方がよいと思いますか?
Java 1.4 を使用する必要があります。