我希望从复杂地图中读取值,并以并行方式执行一个函数。为此,我使用了来自Java 8的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();发布于 2016-12-29 04:54:28
对于并行流,只要不更新,输入集合的线程安全性就没有必要了。另一方面,Hashtable.entrySet()是一个非常糟糕的并行流源,因为Hashtable没有自定义分配器实现。使用HashMap要好得多。尽管如此,提供的所有代码都应该正常工作,无论是HashMap还是Hashtable (尽管Hashtable的效率要低得多)。我怀疑问题在内部没有显示在这里,cakeService.updateCakeOrderStatusAndPrice可能不是线程安全的。
https://stackoverflow.com/questions/41365862
复制相似问题