我有一个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服务调用。如果有的话,请建议。
答案 0 :(得分:0)
正如我在prevoius评论中所指出的那样,“序列化”可能有两个主要原因:
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();
。两个线程都可以访问它们。 但我真的不明白为什么你必须在一个单独的线程中运行两个作业。你可以这样做:
Thread
这样,您ThreadPool
需要{{1}}一半的{{1}},这肯定会让您获得更好的效果。
如果您坚持原始版本,我建议您测量(我的意思是证明您的假设,例如通过日志)。
答案 1 :(得分:0)
您的顺序执行是由于以下几行: bSuccessfulOne = futureOne.get(); bSuccessfulTwo = futureTwo.get();
请列出将来在那里添加结果并停止线程执行。 您可以使用awaitTermination或其他一些东西。 然后从列表中获取未来对象并进行操作。