【问题标题】:Synchronizing Hashmap in Threading在线程中同步 Hashmap
【发布时间】: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 的定义,它不会等到预期键的值出现,正如您所期望的那样。看起来你应该手动处理这个。
  • responseevent 应该是同一个字段吗?

标签: java multithreading hashmap executorservice concurrenthashmap


【解决方案1】:

但是,有时会出现一些事件 ID,但有时无法获取它们。该程序编译得很好,但我不是线程专家,我相信线程导致这个 idMap 不同步。

idMap 是一个ConcurrentHashMap,它被正确同步并被许多人高度使用和测试。如果查找时 id 不在地图中,则它没有被放在那里。如果您对您的代码进行更多解释,我们也许能够找到您的问题。

例如,我看不到 response 对象的来源。 ResponseTask 是否有可能处理与您预期不同的响应? responseevent 应该是同一个参数吗?

我的问题很简单,我怎样才能使 idMap 工作顺利并获得我想要的事件 ID?

要弄清楚程序的正确操作应该是什么有点困难。如果您正在寻找其他线程来获取事件,您可以使用BlockingQueue。然后你的另一个线程可以做一个queue.take(),它会等到有一个事件要处理。但我不确定这里的目标是什么。

非常奇怪的一件事是使用ExecutorService 的地图。你真的需要多个吗?我怀疑您真的应该使用单个Executors.newCachedThreadPool()。但是,也许您希望单个线程处理具有相同 id 的所有请求,在这种情况下您的代码应该可以工作。我假设当您想关闭应用程序时,您正在执行以下操作:

for (ExecutorService executor : executors.values()) {
    executor.shutdown();
}

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2014-01-03
    • 1970-01-01
    • 2021-06-27
    • 2015-09-23
    相关资源
    最近更新 更多