繁体   English   中英

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

[英]Executing multiple threads in java web service

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

我使用原始 Web 服务中的未来对象使用具有固定线程池大小的 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. 某处可能有一个synchronized资源是您的data 两个线程都可以访问它们。

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

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 ,这肯定会给你更好的性能。

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

您的顺序执行是由于以下几行: bSuccessfulOne = futureOne.get(); bSuccessfulTwo = futureTwo.get();

请列出未来添加您的结果并停止线程执行。 您可以使用 awaitTermination 或其他一些东西。 然后从列表中获取未来对象并进行获取操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM