加速顺序java迭代器可能吗?

时间:2009-12-09 03:53:23

标签: java java-ee

这就是我通常迭代集合的方式

 for(Iterator iterator = collectionthing.iterator(); iterator.hasNext();){

我相信我们大多数人这样做,我想知道有没有比顺序迭代更好的方法?有没有任何java库..我可以通过多代码cpu使这个并行执行? =)

期待大家的反馈。

4 个答案:

答案 0 :(得分:7)

Java的多线程在这方面水平相当低。你能做的最好的就是这样:

ExecutorService executor = Executors.newFixedThreadPool(10);
for (final Object item : collectionThingy) {
  executor.submit(new Runnable() {
    @Override
    public void run() {
      // do stuff with item
    }
  });
}
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);

这是Java 6代码。如果在Java 5上运行,则删除@Override注释(它不适用于在Java 5中实现接口但在Java 6中实现接口的对象)。

这样做是为集合中的每个项目创建任务。创建一个线程池(大小为10)来运行这些任务)。你可以用任何你想要的东西替换它。最后,线程池被关闭,代码块等待所有任务完成。

最后一个至少有一两个例外,你需要抓住。猜测是InterruptedExceptionExecutionException

答案 1 :(得分:1)

在大多数情况下,增加的复杂性不值得潜在的性能提升。但是,如果您需要在多个线程中处理Collection,则可以使用Executors执行此操作,这将运行线程池中的所有任务:

int numThreads = 4;
ExecutorService threadExecutor = Executors.newFixedThreadPool(numThreads);
for(Iterator iterator = collectionthing.iterator(); iterator.hasNext();){
    Runnable runnable = new CollectionThingProcessor(iterator.next());
    threadExecutor.execute(runnable);
}

答案 2 :(得分:1)

作为fork-join框架的一部分,JDK7应该(尽管不确定)具有并行数组。这旨在允许在多核计算机上跨阵列有效地实现某些操作。但是将数组切成碎片并将其扔到线程池中也是有效的。

答案 3 :(得分:0)

很抱歉,Java对自动并行没有这种语言级别的支持,如果你愿意,你必须自己使用库和线程实现它。