の同期でいくつかの問題に直面していますidMap
。このマップは、run()
同時に実行される 2 つのメソッドで使用されています。最初の run() メソッドでは、単にイベント ID 値) を応答 ID (キー) にマッピングしています。2 番目の run() メソッドでは、同じ応答 ID (キー) でイベント ID (値) を取得したいと考えています。ただし、イベント ID が存在する場合と取得できない場合があります。プログラムは問題なくコンパイルされますが、私はスレッド化の専門家ではありません。スレッド化が原因idMap
で同期がずれていると思います。私の質問は、どうすればidMap
スムーズに動作し、意図したとおりにイベント ID を取得 できるかということです。
ConcurrentHashMap<String, String> idMap = new ConcurrentHashMap<String, String>();
ConcurrentHashMap<String, ExecutorService> executors = new ConcurrentHashMap<String, ExecutorService>();
private final class ResponderTask implements Runnable {
private ResponderTask(Event event) {
this.event = event;
}
// 1st run()
public void run() {
idMap.put(response.getId(), event.getId());
}
}//end ResponderTask
private final class QuoteTask implements Runnable {
//constructor
//2nd run()
public void run() {
IdMap.get(response.getId());
}
}//end QuoteTask
public void onResponse(final Response response) {
ExecutorService quoteExecutor = executors.get(response.getId());
if (quoteExecutor == null) {
quoteExecutor = Executors.newSingleThreadExecutor();
executors.put(event.getId(), quoteExecutor);
}
quoteExecutor.execute(new ResponderTask(event));
}