2015-12-30 63 views
4

我正在使用JAVA中的executorsevice來執行一些線程,比如說10個線程,線程數可能會有所不同。每個線程正在執行一個SQL服務器查詢。我正在使用Future和Callable類來提交任務。一旦每個線程完成,我都會得到結果[使用future.get()]。在每個executorservice線程後面得到查詢

現在我的要求是,我需要知道每個線程一旦返回結果就執行的查詢,即使結果是空集。

這裏是我的代碼:

List<Future<List>> list = new ArrayList<Future<List>>(); 
    int totalThreads = allQueriesWeight.size(); 
    ExecutorService taskExecutor = Executors.newFixedThreadPool(totalThreads); 
    for (String query : allQueriesWeight) {//allQueriesWeight is an arraylist containing sql server queries 
     SearchTask searchTask = new SearchTask(query); 
     Future<List> submit = taskExecutor.submit(searchTask); 
     list.add(submit); 
    } 

這裏是我的電話功能:

@Override 
public List<SearchResult> call() throws Exception { 
    java.sql.Statement statement = null; 
    Connection co = null; 
    List<SearchResult> allSearchResults = new ArrayList(); 
    try { 
     //executing query and getting results 
     while (r1.next()) { 
      ... 
      allSearchResults.add(r);//populating array 
     } 
    } catch (Exception e) { 
     Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, e); 
    } finally { 
     if (statement != null) { 
      statement.close(); 
     } 
     if (co != null) { 
      co.close(); 
     } 
    } 
    return allSearchResults; 
} 

這裏是我如何得到結果:

for (Future<List> future : list) { 
     try { 
      System.out.println(future.get().size()); 
      List<SearchResult> sr = future.get(); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (ExecutionException ex) { 
      Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

在這上面的for循環,我需要確定返回結果的查詢。我是一個新手,任何幫助/建議是高度讚賞。

謝謝。

+0

的'list'將包含結果恰好在其提交的查詢執行人相同的順序,這樣你就可以用'allQueriesWeight'匹配起來。 – Thilo

+1

但您的SeatchTask已通過查詢?那麼你可能也想將它傳遞給SearchResult? – Jan

+1

定義一個同時擁有執行結果列表和任何性能測量結果的類(即線程ID執行時間等)是否夠簡單?然後你可以返回這個類對象作爲'callable'的結果。 –

回答

1

選擇1: 你必須以相同的順序和同樣大小的兩個列表,這樣你就可以簡單的做如下

for (int i = 0; i < allQueriesWeight.size(); i++) { 
    allQueriesWeight.get(i); 
    futureList.get(i); 
} 

備選方案2: 。如果所有的查詢都是不同的,您可以使用如下所示的地圖,但這種方法會失去執行順序。

int totalThreads = allQueriesWeight.size(); 
Map<String,Future<List>> map = new HashMap<>; 
ExecutorService taskExecutor = Executors.newFixedThreadPool(totalThreads); 
for (String query : allQueriesWeight) {//allQueriesWeight is an arraylist containing sql server queries 
    SearchTask searchTask = new SearchTask(query); 
    Future<List> submit = taskExecutor.submit(searchTask); 
    map.put(query ,submit); 
} 

然後遍歷地圖

for (Entry<String,Future<List>> future : map.) { 
    System.out.println("query is:" +map.getKey()); 
    List<SearchResult> sr = map.getValue().get(); 

} 

替代3 如果你想保持秩序,創造與未來一類和查詢的屬性,然後把那類名單

public class ResultWithQuery { 

    private final Future<List<?>> future; 
    private final String query; 


    public ResultWithQuery(Future<List<?>> future, String query) { 
     this.future = future; 
     this.query = query; 
    } 


    public Future<List<?>> getFuture() { 
     return future; 
    } 


    public String getQuery() { 
     return query; 
    } 

} 

而且

List<ResultWithQuery > list = new ArrayList<ResultWithQuery >(); 
    int totalThreads = allQueriesWeight.size(); 
    ExecutorService taskExecutor = Executors.newFixedThreadPool(totalThreads); 
    for (String query : allQueriesWeight) {//allQueriesWeight is an arraylist containing sql server queries 
     SearchTask searchTask = new SearchTask(query); 
     Future<List> submit = taskExecutor.submit(searchTask); 
     list.add(new ResultWithQuery (submit, query)); 
    } 

並重複列表

for (ResultWithQuery resQuery: list) { 
     try { 
      resQuery.getQuery(); 
      List<SearchResult> sr = resQuery.getFuture.get(); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (ExecutionException ex) { 
      Logger.getLogger(GenericResource.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
+1

這正是尋找的東西。它解決了我的問題。非常感謝你的詳細解答。 –