首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带映射的ParallelStream

带映射的ParallelStream
EN

Stack Overflow用户
提问于 2016-12-28 16:17:06
回答 1查看 1K关注 0票数 2

我希望从复杂地图中读取值,并以并行方式执行一个函数。为此,我使用了来自Java 8的ForkJoinPool。

我在这里面临的问题是,对于少数值,函数被执行了两次。起初我想,Hashmap不是线程安全的,所以我尝试使用HashTable,但是它也是.

代码语言:javascript
复制
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();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-29 04:54:28

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41365862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档