2009-12-09 27 views
1

這是我常迭代集合加速順序java迭代器可能嗎?

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

我相信我們大多數人這樣做,我不知道有沒有更好的辦法不是必須按順序循環?有沒有任何Java庫..我可以讓這個並行執行多代碼的CPU? =)

期待您的反饋。

+0

如果您不需要在迭代時修改集合,則此方法對於(Object elem:collectionthing)**有點整齊**當然它不會更快...... – pstanton 2009-12-09 04:30:07

回答

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

對於ExecutorService而言爲+1。在這一點上,Doug Lea的java.util.concurrent似乎是Java中最好的方法。 – 2009-12-09 04:05:44

+0

我可能知道上面的代碼會阻塞,直到所有線程完成執行(我想永遠等待,notimeout)嗎?因爲我只需要在那之後返回結果?在這種情況下,不需要在executor.awaittermination()之前強制執行executor.shutdown()對嗎? – cometta 2009-12-09 04:44:44

+3

@cometta:如果你不叫'awaitTermination',那麼「主」線程根本不會阻塞等待任務,它會繼續執行下一個代碼。如果你不調用'shutdown',那麼awaitTermination將永遠不會返回。兩者都是必需的。 – 2009-12-09 09:31:28

0

對不起,Java沒有這種對自動並行性的語言級支持,如果你願意,你將不得不使用庫和線程來實現它。

1

在大多數情況下,增加的複雜性不值得潛在的性能增益。但是,如果您需要處理多個線程的集合,你可能使用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); 
} 
1

由於fork-join框架JDK7的一部分應該(雖然不確定)有平行陣列。這旨在允許在多核機器上跨陣列有效地實施某些操作。但只是將數組切成片並將其扔到線程池中也會起作用。