這是我常迭代集合加速順序java迭代器可能嗎?
for(Iterator iterator = collectionthing.iterator(); iterator.hasNext();){
我相信我們大多數人這樣做,我不知道有沒有更好的辦法不是必須按順序循環?有沒有任何Java庫..我可以讓這個並行執行多代碼的CPU? =)
期待您的反饋。
這是我常迭代集合加速順序java迭代器可能嗎?
for(Iterator iterator = collectionthing.iterator(); iterator.hasNext();){
我相信我們大多數人這樣做,我不知道有沒有更好的辦法不是必須按順序循環?有沒有任何Java庫..我可以讓這個並行執行多代碼的CPU? =)
期待您的反饋。
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
。
對於ExecutorService而言爲+1。在這一點上,Doug Lea的java.util.concurrent似乎是Java中最好的方法。 – 2009-12-09 04:05:44
我可能知道上面的代碼會阻塞,直到所有線程完成執行(我想永遠等待,notimeout)嗎?因爲我只需要在那之後返回結果?在這種情況下,不需要在executor.awaittermination()之前強制執行executor.shutdown()對嗎? – cometta 2009-12-09 04:44:44
@cometta:如果你不叫'awaitTermination',那麼「主」線程根本不會阻塞等待任務,它會繼續執行下一個代碼。如果你不調用'shutdown',那麼awaitTermination將永遠不會返回。兩者都是必需的。 – 2009-12-09 09:31:28
對不起,Java沒有這種對自動並行性的語言級支持,如果你願意,你將不得不使用庫和線程來實現它。
在大多數情況下,增加的複雜性不值得潛在的性能增益。但是,如果您需要處理多個線程的集合,你可能使用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);
}
由於fork-join框架JDK7的一部分應該(雖然不確定)有平行陣列。這旨在允許在多核機器上跨陣列有效地實施某些操作。但只是將數組切成片並將其扔到線程池中也會起作用。
如果您不需要在迭代時修改集合,則此方法對於(Object elem:collectionthing)**有點整齊**當然它不會更快...... – pstanton 2009-12-09 04:30:07