gpt4 book ai didi

java - 并发远程数据处理

转载 作者:行者123 更新时间:2023-12-01 12:04:13 25 4
gpt4 key购买 nike

我正在编写一个 Java 项目,其中用户可以一次提交多个查询,并且这些查询会同时分派(dispatch)到我的一台服务器上进行处理。

为了举例说明这一点,假设用户一次输入多个帐号。该程序应该将这些帐号中的每一个单独发送到我的服务器并等待处理结果。当服务器返回每个结果时,程序会更新 Java Swing JList 以向用户显示这些结果。

那么,假设用户输入:

00001
00002
00003
00004

然后程序会同时分派(dispatch) 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 中显示给用户。所以服务器可能会向账户00004请求返回:4312 向账户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 。但它几乎可以归结为同一件事。

关于java - 并发远程数据处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27760887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com