2017-10-17 42 views
0

I HV下面的代碼如何在調用executorService.invokeAll(callables)時按順序獲取Future列表?

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地址外的任何方法來識別。有沒有什麼辦法可以按照與可召集的順序相同的順序來獲得期貨。

有什麼想法?

+0

甚至不要嘗試像依賴訂單那樣做一些脆弱而愚蠢的事情,但在例外中包含地址,例如?請注意,您正在使用'HashSet',所以您沒有訂單。 – Kayaman

+1

雖然它可能不是*指定*,我認爲這個順序可能是相同的(如果你使用'List'而不是'HashSet',這將更容易檢查)。但我一般都認爲,除了短時間,高度可控的本地調試以外,您不應該依賴此類功能。 – Marco13

+0

@Kayaman但是我從第三方APIC返回通用ExecutionException,我無法控制其添加IP地址 – abyin007

回答

1

它不可能以與可加密相同的順序獲得期貨。請注意,它在多線程環境中運行,並且沒有關於如何執行線程的特定順序。我能想到的辦法2這裏:

  1. IP地址作爲異常消息的一部分,你可以提取有
  2. 勇能趕上在贖回的異常,並把它包裝成你的結果的一部分。可能你可以使用javalangs爲了這個嗎?
+0

但我從第三方APIC返回泛型ExecutionException,我沒有控制添加ipaddress – abyin007

相關問題