gpt4 book ai didi

java - 如何以多线程方式调用返回List元素的方法

转载 作者:行者123 更新时间:2023-12-03 13:10:21 25 4
gpt4 key购买 nike

我有这种方法:

    public List<String> composeList (DataBaseObject dBO) {
List<String> valueList = new ArrayList<>();
for (String separatedFieldName : separatedFieldNames) {
object = PropertyUtils.getProperty(object, separatedFieldName);
valueList.add(object.toString());
}
}

我有一个1000 dBO对象的列表,想以多线程的方式调用此方法。

但是,此方法的返回也包含在列表中

这是调用者:
List<List<String>> valueLists =  new ArrayList<>();
for (DataBaseObject dBO : listOfDBOs)
valueLists.add(composeList(dBOObject));

由于现在的机器有多个内核,所以我想知道如何利用它们。就像我如何在parelel中调用composeList并将结果存储在一个ArrayList中一样。

我知道我可以使用Collections.SynchronizedList,但是composeList的执行时间非常短,以至于我最终会在一个序列中添加元素,即使是多线程的,它也仍将是顺序执行,因为每次添加都会锁定同步列表。

这听起来像是一个设计问题,但仍然与编程有关。在这种情况下,我将不胜感激。

最佳答案

Java 8并行流正是针对这种情况而设计的。

List<String> dbFieldValues = dbObjectList.parallelStream()
.flatMap(seperatedFieldNames().parallelStream()
.map(fn -> PropertyUtils.getProperty(db, fn).toString()))
.collect(Collectors.toList());

假设 seperatedFieldNames的集合支持并行流(例如 ArrayList),它将使用多个线程,而无需自己创建它们。

请注意,这假设 getProperty没有副作用。

关于java - 如何以多线程方式调用返回List元素的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35592969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com