并发远程数据处理

Concurrent Remote Data Processing

我正在编写一个 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,但我很想听听一些替代想法。如果有人可以提供示例或指向处理类似问题的示例的链接,我们将不胜感激。

提前谢谢你。

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。但它几乎归结为同一件事。