0

多くのスレッドがリクエストを に投稿するプログラムがありますPriorityQueue。その後、 からの応答を待ちConcurrentSkipListMapます。への回答を公開する 1 つのスレッドがありますConcurrentSkipListMap

次のコード行は、これを示しています。

プログラムの初期化時

PriorityQueue<Request> requests = new PriorityQueue<Request>();
ConcurrentSkipListMap<Long, Reponse> responsesReceived = new ConcurrentSkipListMap<Long, Reponse>();

呼び出し元スレッドで

// Send request ...
Request r = ... // Elaborate the request 
requests.add(r);

// ... then wait for an answer
Long id = r.getId();
while (responsesReceived.containsKey(id) == false) {
    synchronized (responsesReceived) {
         responsesReceived.wait();
    }
}

Answer a = responsesReceived.take(id);

// Do other things ...

THE 応答ハンドラ スレッド内

// Wait for a remote answer
Answer answer = ...;

// Once received publish it in ConcurrentSkipListMap
responsesReceived.put(answer.getRequestId(), answer);

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

// Go back and wait for a new answer...

質問

  • で呼び出し元スレッドと応答ハンドラ スレッドを同期しても安全ConcurrentSkipListMapですか?
  • 同期にはロックを使用する必要がありますか?
  • HashMapのロック ( )を使用する必要がありHashMap<Long,Object>ますか?

私は java.util.concurrent API にかなり慣れていないので、いくつか疑問があります...

4

2 に答える 2

1

synchronized/wait/notify を使用すると、任意のオブジェクトをロックとして使用できます。ジョブをキューに投入して結果を待つ方法についてはExcutorService、 、Future、および を参照してくださいCompletionService

于 2013-03-28T10:12:34.477 に答える
0

これはうまくいくかもしれませんが、あなたがしていることを表現する最も明確な方法ではないかもしれません. そのような通知用に別の「ロック」オブジェクトを追加します。

注: 待機中のスレッドが 1 つしかない場合を除き、notifyAll() を使用します。

于 2013-03-28T10:12:19.273 に答える