2013-09-30 61 views
0

裏面foreach循環我調用一個方法:的foreach循環到下一個迭代,而不waitng爲當前迭代

for (Iterable pl : ilist) { 

myMethod(); 

} 

myMethod的()可能需要很長的時間currennt(如幾分鐘或幾天)P1的對象,但即使我正在執行下一次迭代(這可以稱爲異步調用,據我所知)

這是甚至可能與一個foreach循環?

+5

不,這是不可能的。你可以在這裏使用線程IMO。或者等待Java-8,這將允許並行流式迭代。 –

回答

1

所有你需要做的是爲你的循環的每次迭代產生一個新的Thread。我可能會這樣做。

for (/* whatever */) { 
    new Thread() { 
     public void run() { 
      myMethod(); 
     } 
    }.start(); 
} 
+0

保持簡單的方法。 我喜歡那樣! – SoulMagnet

5

如果您想要將這些任務安排爲異步完成,您可以創建一個新的Runnable並將其交給ExecutorService以在另一個線程上運行該操作。現在您需要知道如何處理此任務的結果。

// ExecutorService Thread Pool with 10 threads 
ExecutorService executor = Executors.newFixedThreadPool(10); 

public void iterate(Collection<?> collection) { 
    for (Object o : collection) { 
     executor.execute(createTask(o)); 
    } 

} 

public Runnable createTask(final Object o) { 
    return new Runnable() { 
     public void run() { 
      // do task. 
     } 
    }; 
} 

你會想看看Callable和Future來獲得更多的複雜性。

+0

酷和複雜的解決方案。 但爲什麼不實施大衛華萊士的解決方案? 我想保持簡單! – SoulMagnet

+1

@SoulMagnet ExecutorService在剛開始線程上的使用有很多。首先,使用ExecutorService可以管理線程的行爲。您可以保留一個對大小和執行行爲有限制的線程池,並且可以更輕鬆地控制線程生命週期行爲。如果沒有線程池來管理這種行爲,則會給開發人員帶來更大的負擔來管理每個線程。我提供的例子不是從體系結構角度管理應用程序中的線程的* best *方法,但它確實演示瞭如何使用ExecutorService。 – codethulhu