我有一个场景,我需要对一个非常大的列表(比如 9000+)条目进行一些处理,然后将处理后的条目添加到一个新列表中。所以为了做到这一点,我采取了多线程的方法。
在以下两种方式中,哪种方式效率更高:
- 我应该给每个线程单独的列表对象,然后将所有线程的结果添加到一个最终列表中。
- 我应该使用同步列表并允许所有线程同时添加到该列表中。
我有一个场景,我需要对一个非常大的列表(比如 9000+)条目进行一些处理,然后将处理后的条目添加到一个新列表中。所以为了做到这一点,我采取了多线程的方法。
在以下两种方式中,哪种方式效率更高:
当线程可以独立工作时,它们的工作效果最好。我倾向于给每个线程自己的工作并在它们完成后收集结果。
在此示例中,每个线程独立工作。
ExecutorService service =
List<Work> workList =
int blockSize = (workList.size() + threads -1)/threads;
List<Future<List<Results>>> futureResults = new ArrayList<>();
for(int i=0;i<threads;i++) {
int start = i * blockSize;
int end = Math.min(workList.size(), (i + 1) * blockSize);
final List<Work> list2 = worksList.subList(start, end);
futureResults.add(service.submit(new Callable<List<Results>>() {
public List<Results> call() {
return process(list2);
}
});
}
List<Results> results = new ArrayList<>();
for(Future<List<Results>> future:futureResults)
results.addAll(future.get());
在事物的宏伟计划中,9000 个条目并不是很多需要处理的事情。如果你说,900 万个条目,每个条目需要 10 秒来处理,那可能是另一回事了。
除非处理每件事需要很长时间(相对)并且不受CPU 限制(比如在远程机器上等待做某事),否则我会说在这种情况下多线程不会给你任何东西,而是不需要复杂。
即使处理时间很长,线程也意味着共享数据,从您提供的非常稀疏的模糊信息来看,一个简单的异步方法可能会更好地使用Queue
from java.util.concurrency
。