多くのスレッドがリクエストを に投稿するプログラムがあります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 にかなり慣れていないので、いくつか疑問があります...