【发布时间】:2015-12-30 08:17:09
【问题描述】:
我在 JAVA 中使用 executorsevice 来执行一些线程,比如说十个线程,线程数可能会有所不同。每个线程都在执行一个 SQL 服务器查询。我正在使用 Future 和 Callable 类来提交任务。一旦每个线程完成,我就会得到结果 [使用 future.get()]。
现在我的要求是我需要知道每个线程在返回结果后执行的查询,即使结果是空集。
这是我的代码:
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将包含与您向 Executor 提交查询的顺序完全相同的结果,因此您可以将它们与allQueriesWeight匹配。 -
但是您的 SeaatchTask 已通过查询?所以你可能也想把它传递给 SearchResult?
-
定义一个包含执行结果列表以及任何性能度量(即线程 ID、执行时间等)的类还不够简单吗?然后,您可以返回该类对象作为您的
callable的结果。
标签: java multithreading executorservice