2014-03-05 59 views
2

我使用的是Executors.newSingleThreadExecutor(),javadoc表示: tasks are guaranteed to execute sequentially。所以我認爲我的List<Future<String>> futures = new ArrayList<Future<String>>()將被命令,但事實並非如此。Java執行器的執行策略

列表中的第一個元素是第3個線程的結果...

ExecutorService pool = Executors.newSingleThreadExecutor(); 
    List<Future<String>> futures = new ArrayList<Future<String>>(); 
    for (int i=0;i<x.size();i++){ 
     futures.add(pool.submit(new ThreadTest())); 
    } 
    pool.shutdown(); 
    pool.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); 
    String test= futures.get(0).get(); <-- The result of the 3rd thread 
    String test1 = futures.get(1).get(); <-- The result of the 5th thread 
    ..... 

我沒有得到的邏輯。

有什麼想法?

謝謝

+0

順序只意味着一次一個。措詞不能保證任何關於訂購。 –

回答

2

執行人只能並行處理一個任務 - 要一次提交所有的任務 - 這意味着他們是「可用」的執行隊列。

執行程序將能夠選擇隊列中的任何任務並將其分配給恰好一個跑步者線程。

+0

謝謝你的回答。我雖然同樣的事情。你有什麼想法如何應用FIFO策略? – javacurve

+0

在提交下一個標記之前每次提交後調用Future.get() –