2014-03-05 128 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() –