2

我有一个 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 服务调用。如果有,请建议。

4

2 回答 2

0

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

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

于 2015-02-27T03:35:38.663 回答
0

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

  1. 负载很大,可能是并行到达的请求太多,所以你MyThread的s没有同时放入等待队列。如果执行线程的数量足够少,您可能会看到作业一个接一个地执行。
  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();

这样你需要一半的Threads ThreadPool,这肯定会给你更好的性能。

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

于 2013-02-08T15:54:03.767 回答