0

我很难交互HashMap<String, Future<DPSImporterServiceImpl>>

    for (Entry<String, Future<DPSImporterServiceImpl>> entry : map.entrySet()) {
        logger.debug("Thread: " + entry.getKey() + "/"
                + entry.getValue());
        Future<DPSImporterServiceImpl> fut = entry.getValue();
        try {
            DPSImporterServiceImpl imp = fut.get();
            logger.debug("Waiting over for: " + imp.toString());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

我的地图包含两个条目:{1435748953925=java.util.concurrent.FutureTask@705f23aa, 1435748971395=java.util.concurrent.FutureTask@761ea788}

这是我的记录器结果:

Thread: 1435748953925/java.util.concurrent.FutureTask@705f23aa
Waiting over for: Thread busy with 1435748971395.
Thread: 1435748971395/java.util.concurrent.FutureTask@761ea788
Waiting over for: Thread busy with 1435748971395.

正如您所看到的,地图得到了正确的迭代,因为以开头的日志语句Thread...是地图中的。该get()方法虽然不能正常工作,因为它显然是从同一个对象调用的(两次都是从带有 key 的第二个条目1435748971395)。

这让我很困惑,因为地图肯定不包含相同的对象。

你能告诉我这里可能有什么问题吗?谢谢!

4

1 回答 1

0

好吧,以下代码段按预期工作:

Map<String, Future<String>> map = new HashMap<>();

ExecutorService service = new ScheduledThreadPoolExecutor(1);

Future<String> future1 = service.submit(() -> {
    Thread.sleep(1000);
    return "1";
});
Future<String> future2 = service.submit(() -> {
    Thread.sleep(1000);
    return "2";
});

map.put("1", future1);
map.put("2", future2);

for (Map.Entry<String, Future<String>> entry : map.entrySet()) {
    System.out.println("Thread: " + entry.getKey() + "/" + entry.getValue());
    Future<String> fut = entry.getValue();
    try {
        String imp = fut.get();
        System.out.println("Waiting over for: " + imp);
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
}

service.shutdown();

在我看来,问题可能出在 DPSImporterServiceImpl 或地图中这些期货的获得方式上。

于 2015-07-01T14:32:00.643 回答