3

Java で ExecutorService を使用して Threads を呼び出し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 を作成して ArrayList に追加したのと同じ順序で future.get() からの結果を受け取ることは保証されていますか? ドキュメンテーションには次のように書か 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.れています。

答えてくれてありがとう!:-)

4

2 に答える 2

8

これはまさにこの声明の一部が言っていることです:

指定されたタスクリストのイテレータによって生成されたのと同じ順序で、タスクを表すFutureのリストを返します。

Futureは、元のsのリストにアイテムを挿入したのとまったく同じ順序で取得されますCallable

于 2012-03-09T15:40:14.743 に答える