【发布时间】:2016-06-06 04:49:10
【问题描述】:
我有这个方法:
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));
由于现在的机器有多个内核,我想知道如何使用它们。就像我如何在并行中调用 composeList 并将结果存储在一个 ArrayList 中一样。
我知道我可以使用 Collections.SynchronizedList,但是 composeList 的执行时间非常短,以至于我最终会按顺序添加元素,即使是多线程的,它仍然是顺序执行,因为每次添加都会放锁定 Sysnchronized 列表。
这听起来像是一个设计问题,但它仍然与编程相关。对于这种情况,我非常感谢任何帮助。
【问题讨论】:
-
我认为您不能同时安全地写入对象。您可以在运行另一个任务时调用列表填充器,但不能让两个任务同时编辑同一个列表。这就是为什么 SynchronizedLists 在这样使用时基本上是顺序行为,这是唯一安全的方法。
-
就像我说的,这不一定是与列表人口有关的问题。也许你也可以提出一些关于设计的建议。不幸的是,我必须等待列表人口完成才能完成下一个任务。所以不能同时调用其他任何东西。
-
在你的例子中不清楚,为什么添加到
valueList是在循环之外。据我了解,您要添加所有字段的所有值? -
@KenBekov 哦抱歉打错了
标签: java multithreading arraylist