Parallel processing 带地图的并行流
我想从复杂映射中读取值,并以并行方式执行一个函数。为此,我使用Java8中的ForkJoinPool 我在这里面临的问题是,对于一些值,函数执行两次。 起初我认为,Hashmap不是线程安全的,所以我尝试使用HashTable,但它是相同的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
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)
。