Java:带有Callables的ExecutorService:invokeAll()和future.get() - 结果是否正确?

时间:2012-03-09 11:02:39

标签: java multithreading invoke executorservice callable

我使用Java中的ExecutorService来调用invokeAll()的线程。之后,我得到future.get()的结果集。以我创建线程的相同顺序收到结果非常重要。

这是一个片段:

try {
    final List threads = new ArrayList();

    // create threads
    for (String name : collection)
    {
        final CallObject object = new CallObject(name);
        threads.add(object);
    }

    // start all Threads
    results = pool.invokeAll(threads, 3, TimeUnit.SECONDS);

    for (Future<String> future : results)
    {
        try
        {
            // this method blocks until it receives the result, unless there is a 
            // timeout set.
            final String rs = future.get();

            if (future.isDone())
            {
                // if future.isDone() = true, a timeout did not occur. 
               // do something
            }
            else
            {
                // timeout
                // log it and do something
                break;
            }
        }
        catch (Exception e)
        {
        }
    }

}
catch (InterruptedException ex)
{
}

我是否确保以与创建新CallObjects相同的顺序从future.get()接收结果并将它们添加到我的ArrayList中?我知道,文档说如下: invokeAll(): returns a list of Futures representing the tasks, in the same sequential order as produced by the iterator for the given task list. If the operation did not time out, each task will have completed. If it did time out, some of these tasks will not have completed.但我想确保我理解正确......

谢谢你的回答! : - )

2 个答案:

答案 0 :(得分:4)

这正是这句话的内容:

  

返回表示任务的Futures列表   由给定任务列表的迭代器生成的顺序。

您将按照Future s原始列表中项目的确切顺序获取Callable

答案 1 :(得分:1)

根据文档,您将以相同的顺序获得期货。

未来对象只是该任务的参考。

Future#get() is blocking call.

前者

我们已经提交了4项任务。

任务1 - &gt;完成

任务2 - &gt;完成

任务3 - &gt;超时

任务4 - &gt;完成

根据我们的代码

for (Future future : futures) {
  future.get(); }

对于1&amp; 2秒任务,它将立即返回。我们将等待第三项任务完成。即使第4个任务完成,迭代也在等待第三个任务。第三个任务完成或定时等待到期时,只有迭代才会继续。