他のメンバーメソッドによって、クラスで定義されたスレッドと通信するためにwait-notifyコンストラクトを使用するコードに出くわしました。面白いことに、ロックを取得した後、同期スコープ内のすべてのスレッドは、同じロックで時限待機します (以下のスニペットを参照)。その後、同期されていないスコープで、スレッドはその主要な機能を実行します (つまり、'//何か役に立つ1'を実行します)。
このメカニズムの目的についての私の最善の推測は、「someMethod」への呼び出しが他のスレッドによって行われるまで、スレッドのリソース消費を最小限に抑えることです。専門家はどう思いますか?この場合、この動作を達成するためのより良い方法は何ですか?
class SomeClass{
public void run() {
while (!isShuttingDown){
try {
synchronized (SomeClass.class) {
SomeClass.class.wait(500);
}
} catch (Throwable e) {
LOGGER.info(SomeClass.class.getSimpleName() + " reaper thread interrupted", e);
}
//do something useful1
}
}
public synchronized void someMethod(){
//do something useful2
synchronized (SomeClass.class) {
SomeClass.class.notifyAll();
}
//do something useful3
}
}