gpt4 book ai didi

java - 在java web服务中执行多个线程

转载 作者:行者123 更新时间:2023-11-29 09:06:23 25 4
gpt4 key购买 nike

我有一个 Web 服务,它在其中一个 Web 方法中创建两个线程并调用另外两个 Web 服务来插入数据。现在,我的原始 Web 服务预计可以并行接收 1,000 到 10,000 次调用。因此,您可能会理解,对于内部的每个此类调用,我的 Web 服务都将创建另外两个线程。我已经针对如此重的负载调整了我的应用程序服务器。相信我。

我在原始 Web 服务中使用了使用 future 对象的固定线程池大小的 Executor,但我发现对其他两个 Web 服务的调用似乎是按顺序处理的。我已经检查了所有教程/代码片段。我的代码似乎是正确的。

ExecutorService executor = Executors.newFixedThreadPool(size);
Future<Boolean> futureOne = executor.submit(new MyThread(serviceOne, data));
Future<Boolean> futureTwo = executor.submit(new MyThread(serviceTwo, data));
bSuccessfulOne = futureOne.get();
bSuccessfulTwo = futureTwo.get();

鉴于我写的第一段是否有任何多线程/作业并行框架/只是一些可能有助于并行处理这些 Web 服务调用的常识性编程。如果有,请提出建议。

最佳答案

正如我在前面的评论中指出的,它被“序列化”的主要原因有两个:

  1. 负载很大,可能是并行到达的请求太多,所以你的MyThread没有同时放入等待队列。如果执行线程的数量足够少,您可能会看到作业一个接一个地执行。
  2. 某处可能有一个同步资源是您的数据。两个线程都可以访问它们。

但我真的不明白为什么你必须在一个单独的线程中运行两个作业。你可以这样做:

ExecutorService executor = Executors.newFixedThreadPool(size);
Future<Boolean> futureOne = executor.submit(new MyThread(serviceOne, data));
Runnable jobTwo = new MyThread(serviceTwo, data);
jobTwo.run();
bSuccessfulOne = futureOne.get();

这样,您的ThreadPool 中的Thread 数量将减少一半,这肯定会给您带来更好的性能。

如果您坚持使用原始版本,我建议您测量(我的意思是证明您的假设,例如通过日志)。

关于java - 在java web服务中执行多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14773517/

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