我正在编写一个Java项目,用户可以一次提交多个查询,并同时调度它们以便在我的一台服务器上进行处理。
为了举例说明这一点,我们假设用户一次输入多个帐号。程序应将每个帐号分别发送到我的服务器并等待处理结果。当服务器返回每个结果时,程序会更新Java Swing JList以向用户显示这些结果。
所以,让我们说用户输入:
00001
00002
00003
00004
然后,该程序将同时发送4个不同的请求:
http://example.com/process_account.php?accountNumber=00001
http://example.com/process_account.php?accountNumber=00002
http://example.com/process_account.php?accountNumber=00003
http://example.com/process_account.php?accountNumber=00004
随着服务器完成,结果将在jlist_AccountResults
中显示给用户。因此,服务器可能会将43
返回到帐户00004
请求; 12
帐户00002
请求; 36
帐户00001
请求;和29
帐户00003
请求。因此,输出将类似于:
Account 00004: 43
Account 00002: 12
Account 00001: 36
Account 00003: 29
这里的关键点是结果一旦可用就会显示,处理是并发的,而不是顺序的。
目前,程序可以按顺序处理多个查询,但是当查询列表相当长时,处理可能需要很长时间。当然,处理的总时间随着查询数量的增长而增长,但是,例如,如果程序一次可以处理4个查询,则会大大减少总时间。
为了解决这个问题,我一直在研究使用多线程或ExecutorService,但我很想听到一些其他想法。如果任何人都可以提供示例或链接到处理类似问题的示例,那将非常感激。
提前谢谢。
答案 0 :(得分:1)
ExecutorService
是多线程的,它似乎是一个正确的工具。如果您了解有关线程的基础知识并将线程之间的通信限制为最小,那么这应该是最简单的选项。我会做这样的事情:
public static void get(URI[] uris) {
ExecutorService executor = Executors.newFixedThreadPool(4);
for (final URI uri : uris) {
executor.submit(new Callable<Void>() {
@Override
public Void call() throws Exception {
InputStream input = uri.toURL().openStream();
try {
Result result = readIntput(input);
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
// notify UI
}
});
} finally {
input.close();
}
return null;
}
});
}
}
异步IO是另一种选择。例如:AsyncHttpClient。但它几乎归结为同样的事情。