0

他のメンバーメソッドによって、クラスで定義されたスレッドと通信するために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
    }
}
4

2 に答える 2

4

ここに記載されているように、

待機通知パターンは、1 つのスレッドが他のスレッドに何らかのイベントが発生したことを伝える必要がある幅広いケースで使用されます。特定のスレッドが他のスレッドによって作成された「ジョブをピックアップ」する必要があるスレッド プールまたはプロデューサー/コンシューマー シナリオを実装するために一般的に使用されます (この場合、発生した「イベント」は、ジョブが到着したことです)。スレッドの 1 つがピックアップされます)。

于 2013-10-18T14:41:30.470 に答える