Parallel processing 带地图的并行流

Parallel processing 带地图的并行流,parallel-processing,java-8,java-stream,Parallel Processing,Java 8,Java Stream,我想从复杂映射中读取值,并以并行方式执行一个函数。为此,我使用Java8中的ForkJoinPool 我在这里面临的问题是,对于一些值,函数执行两次。 起初我认为,Hashmap不是线程安全的,所以我尝试使用HashTable,但它是相同的 final Map<CakeOrder, List<CakeOrderDetails>> cakeOrderMap = cakeUpdatesQueueItemDao.getCakeOrdersByStatus(EItemStatus

我想从复杂映射中读取值,并以并行方式执行一个函数。为此,我使用Java8中的ForkJoinPool

我在这里面临的问题是,对于一些值,函数执行两次。 起初我认为,Hashmap不是线程安全的,所以我尝试使用HashTable,但它是相同的

final Map<CakeOrder, List<CakeOrderDetails>> cakeOrderMap = cakeUpdatesQueueItemDao.getCakeOrdersByStatus(EItemStatus.OPENED, country.getDbTableSuffix(), true);
final Map<CakeOrder, List<CakeOrderDetails>> cakeOrderTableMap = new Hashtable<>();

cakeOrderMap.forEach((k, v) -> cakeOrderTableMap.put(k, v));

final ForkJoinPool pool = new ForkJoinPool(20);
pool.submit(() -> cakeOrderTableMap.entrySet()
   .stream()
   .parallel()
   .forEach(entry -> cakeService.updateCakeOrderStatusAndPrice(entry.getKey(), entry.getValue()))).invoke();
final Map-cakeOrderMap=cakeUpdatesQueueItemDao.getCakeOrdersByStatus(EItemStatus.OPENED,country.getDbTableSuffix(),true);
最终映射cakeOrderTableMap=新哈希表();
forEach((k,v)->cakeOrderTableMap.put(k,v));
最终ForkJoinPool池=新ForkJoinPool池(20);
pool.submit(()->cakeOrderTableMap.entrySet()
.stream()
.parallel()
.forEach(entry->cakeService.updateCaeOrderStatusandPrice(entry.getKey(),entry.getValue()).invoke();

对于并行流,输入集合的线程安全性是不必要的,只要它没有更新。另一方面,
Hashtable.entrySet()
对于并行流来说是一个非常糟糕的源代码,因为
Hashtable
没有自定义的拆分器实现。使用
HashMap
要好得多。尽管如此,提供的代码一切都应该正常工作,无论是使用
HashMap
还是使用
Hashtable
(尽管使用
Hashtable
效率要低得多)。我怀疑问题在cakeService.updateCakeOrderStatusAndPrice中没有显示,这可能不是线程安全的。

请注意,Hashtable文档的最后一句说,建议使用ConcurrentHashMap而不是Hashtable。此外,您还可以直接从HashMap获取哈希表,只需将其传递给构造函数即可。顺便说一句,还有
cakeOrderTableMap.putAll(cakeOrderMap)