0

我有一个场景,我需要对一个非常大的列表(比如 9000+)条目进行一些处理,然后将处理后的条目添加到一个新列表中。所以为了做到这一点,我采取了多线程的方法。

在以下两种方式中,哪种方式效率更高:

  1. 我应该给每个线程单独的列表对象,然后将所有线程的结果添加到一个最终列表中。
  2. 我应该使用同步列表并允许所有线程同时添加到该列表中。
4

2 回答 2

2

当线程可以独立工作时,它们的工作效果最好。我倾向于给每个线程自己的工作并在它们完成后收集结果。

在此示例中,每个线程独立工作。

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()); 
于 2012-07-18T16:14:18.483 回答
1

为什么你认为线程是一种解决方案,你并没有真正列出并发解决的问题?

在事物的宏伟计划中,9000 个条目并不是很多需要处理的事情。如果你说,900 万个条目,每个条目需要 10 秒来处理,那可能是另一回事了。

除非处理每件事需要很长时间(相对)并且不受CPU 限制(比如在远程机器上等待做某事),否则我会说在这种情况下多线程不会给你任何东西,而是不需要复杂。

即使处理时间很长,线程也意味着共享数据,从您提供的非常稀疏的模糊信息来看,一个简单的异步方法可能会更好地使用Queuefrom java.util.concurrency

于 2012-07-18T16:19:39.760 回答