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

时间:2013-02-08 13:20:52

标签: java multithreading glassfish jax-ws executorservice

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

2 个答案:

答案 0 :(得分:0)

正如我在prevoius评论中所指出的那样,“序列化”可能有两个主要原因:

  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(); 。两个线程都可以访问它们。
  3. 但我真的不明白为什么你必须在一个单独的线程中运行两个作业。你可以这样做:

    Thread

    这样,您ThreadPool需要{{1}}一半的{{1}},这肯定会让您获得更好的效果。

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

答案 1 :(得分:0)

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

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