[英]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 服务调用。 如果有,请建议。
正如我在前面的评论中所指出的,它被“序列化”可能有两个主要原因:
MyThread
没有同时放入等待队列。 如果执行线程的数量足够少,您可能会看到作业一个接一个地执行。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.