我正在使用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循環,我需要確定返回結果的查詢。我是一個新手,任何幫助/建議是高度讚賞。
謝謝。
的'list'將包含結果恰好在其提交的查詢執行人相同的順序,這樣你就可以用'allQueriesWeight'匹配起來。 – Thilo
但您的SeatchTask已通過查詢?那麼你可能也想將它傳遞給SearchResult? – Jan
定義一個同時擁有執行結果列表和任何性能測量結果的類(即線程ID執行時間等)是否夠簡單?然後你可以返回這個類對象作爲'callable'的結果。 –