0
private boolean getNodeReachability(final String ip) {
    // TODO Auto-generated method stub

    if(!nodeReachabilityStatusMap.containsKey(ip)){
        statusAvailable = Boolean.FALSE;
        new Thread(){
            public void run(){
                while(true){
                    if(nodeReachabilityStatusMap.containsKey(ip)){
                        statusAvailable = Boolean.TRUE;
                        notifyAll();
                        break;
                    }
                }
            }
        }.start();

        while(statusAvailable==Boolean.FALSE){
            try{
                wait(5000); 
            }catch(InterruptedException ex){
                Log.addInLog(Log.DBG, ex.getMessage());
            }
        }

    }

    return nodeReachabilityStatusMap.get(ip);
}

実際getNodeReachabilityには、関数はノード アクセス可能または NOT のステータスを返します。これは で維持されておりnodeReachabilityStatusMap、通知の取得時にコードの他のセクションで更新しています。問題は、通知が遅れている場合、このマップでエントリが見つかるまで待つ必要があることです。だから私は現在のスレッドをチェックして通知している新しいスレッド(関数内)を生成しています。私は同期されたキーワードを使用していません。そのため、どのように動作し、正しい方法でそれを行うか。

4

1 に答える 1

0

呼び出しスレッドは、オブジェクトのモニター ロックを呼び出して、そのオブジェクトに対して保持する必要がありwait()ます。したがって、いくつかのオブジェクトでコードを同期し、それを同期に使用する必要があります。notify()notifyAll()

synchronized(someObject){ // can be "this" or anything that is not null and primitive 
    someObject.wait()
}

// on another thread

synchronized(someObject){
    someObject.notify();
}

IMHOが新しいスレッドを生成することは、新しいスレッドで行っていることはすべて、それを呼び出すスレッドで実行できるため、まったく不要です。

于 2013-10-30T11:51:31.627 に答える