如何在调用executorService.invokeAll(callables)时按顺序获取Future列表?

时间:2017-10-17 13:57:30

标签: java multithreading

我有以下代码

final ExecutorService executorService = Executors.newFixedThreadPool(ipAddressList.size());
        final Set<Callable<JsonObject>> callables = new HashSet<Callable<JsonObject>>();
        for (final String remoteHostName : ipAddressList)
        {
            callables.add(new Callable<JsonObject>() {
                @Override
                public JsonObject call()
                        throws ConnectionFailedException
                {
                    return connectToHost(remoteHostName, options, attributes);
                }
            });
        }

        List<Future<JsonObject>> futures = null;
        try
        {
            futures = executorService.invokeAll(callables);
        }
        catch (final InterruptedException e)
        {...
        }

        for (final Future<JsonObject> future : futures)
        {
          ..}

现在问题是,异常可能发生在任何线程中,但我没有任何方法来识别哪个IP地址异常。是否有任何方法可以使期货的顺序与可调整的顺序相同。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

它不可能以与Callables相同的顺序获得Futures ..注意它在多线程环境中运行,并且没有关于如何执行线程的特定顺序。我可以在这里想到2种方法:

  1. 作为异常消息的一部分的IP地址,您可以从那里提取
  2. Yon可以捕获Callable中的异常并将其包装为结果的一部分。也许你可以使用javalangs吗?