这就是我通常迭代集合的方式
for(Iterator iterator = collectionthing.iterator(); iterator.hasNext();){
我相信我们大多数人这样做,我想知道有没有比顺序迭代更好的方法?有没有任何java库..我可以通过多代码cpu使这个并行执行? =)
期待大家的反馈。
答案 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)来运行这些任务)。你可以用任何你想要的东西替换它。最后,线程池被关闭,代码块等待所有任务完成。
最后一个至少有一两个例外,你需要抓住。猜测是InterruptedException
和ExecutionException
。
答案 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对自动并行没有这种语言级别的支持,如果你愿意,你必须自己使用库和线程实现它。