并发远程数据处理

时间:2015-01-03 23:54:02

标签: java multithreading asynchronous executorservice

我正在编写一个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,但我很想听到一些其他想法。如果任何人都可以提供示例或链接到处理类似问题的示例,那将非常感激。

提前谢谢。

1 个答案:

答案 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。但它几乎归结为同样的事情。