java - 使用Java同时调用多个Web服务

标签 java multithreading performance parallel-processing

我想用同一个方法调用 3 个 Web 服务,每个结果都将设置在一个对象中,如下代码所示:

public Dossie procuraPorCPF(String cpf) {

    Dossie dossie = new Dossie();

    // first webservice call
    dossie.setCnh(detectaClientCnh.verificaCNH(cpf));

    // second webservice call
    dossie.setFotoCnh(detectaClientCnhFoto.verificaFotoCNHPorCpf(cpf));

    // third webservice call
    dossie.setPm(consultaPMWService.getPMPorCPF(cpf).getProcuraPMPorCPFResult());

    return dossie;
}

在上面的例子中,我调用了 3 个不同的 Web 服务,每个服务大约需要 5 秒,然后就不好继续这段代码了。我想知道同时调用 3 个网络服务的最佳方法是什么,以及如何使用此代码作为示例来做到这一点。我在这里搜索了一些文章甚至答案,但我不知道该怎么做。感谢您的耐心等待。

最佳答案

Java 中的并发性是通过 Thread 类处理的。 Thread 构造函数接受一个 Runnable 参数,其中包含要运行的 Thread 代码。当调用 start() 方法时,JVM 创建新线程并执行 Runnablerun() 方法中的代码。

由于 Runnable 仅具有单个抽象方法 run(),因此您可以使用 lambda expression以获得更具可读性的代码。我在第一个调用中使用了传统语法,在另外两个调用中使用了 lambda 语法来演示这两种方法。

public Dossie procuraPorCPF(String cpf) {
    Dossie dossie = new Dossie();
    Thread[] threads = new Thread[3];

    threads[0] = new Thread(new Runnable() {
        @Override
        public void run() {
            dossie.setCnh(detectaClientCnh.verificaCNH(cpf));
        }
    };
    threads[0].start();

    threads[1] = new Thread(() ->
        dossie.setFotoCnh(detectaClientCnhFoto.verificaFotoCNHPorCpf(cpf));
    threads[1].start();

    threads[2] = new Thread(() ->
        dossie.setPm(consultaPMWService.getPMPorCPF(cpf).getProcuraPMPorCPFResult());
    threads[2].start();

    try {
        threads[0].join();
        threads[1].join();
        threads[2].join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    return dossie;
}

join() 方法会阻塞程序执行,直到调用的 Thread 完成运行。通过将 join() 放在方法的末尾,您可以保证在返回之前所有 3 个请求都已完成。如果这些请求在您返回之前是否完成并不重要,您只需删除 join() 即可,当应用程序的其余部分运行时,这些请求将在后台继续运行。

对于较大的应用程序,Java 还包括 thread pools它将为您管理Thread的创建。由于您的应用程序仅在本地上下文中使用相同的 3 个 Runnable,因此我认为上面的解决方案更适合(并且对于此答案而言更具教育意义)。

关于java - 使用Java同时调用多个Web服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51461491/

相关文章:

android - 如何在两个VideoView中同时显示同一视频

Javascript - 如何防止嵌套 For 循环期间阻塞?

performance - Python 性能 : iteration and operations on nested lists

java - 如何使用 solrj 4.9.0 提取统计组件

java - Guava 中 Supplier<T> 的倒数

java - 如何在 Java 中使用 StAX Parser 在 XML 中声明 DOCTYPE 和 ENTITY

python - 在Python中与无限循环一起运行服务器

c# - 将所有者授予从另一个线程调用的 MessageBox

performance - 为什么 GCC 和 Clang 不使用 cvtss2sd [内存]?

java - 如何使用java检查值是否位于矩形范围内