【发布时间】:2013-10-21 20:41:35
【问题描述】:
我在同步我的idMap 时遇到了一些问题。此映射用于两个同时运行的run() 方法。在第一个 run() 方法中,我只是将事件 id 值)映射到响应 id(键)。在第二个 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));
}
【问题讨论】:
-
根据
ConcurrentHashMap#get的定义,它不会等到预期键的值出现,正如您所期望的那样。看起来你应该手动处理这个。 -
response和event应该是同一个字段吗?
标签: java multithreading hashmap executorservice concurrenthashmap