如何实现Excutors的Executor服务

时间:2015-10-16 08:21:45

标签: java multithreading

我有以下情况, enter image description here

对于tomcat上的每个请求,我们需要从不同的机器获取数据(这里我们已经在每台机器上都有休息服务),作为响应,我们将来自不同机器的所有响应的合并数据发送到该请求。
为此我们实现了ExcuterServices,如下所示

ExecutorService executor = Executors.newFixedThreadPool(numThreads);
      List<Future<Object>> results = executor.invokeAll(callables, 2000,TimeUnit.MINUTES);  

这需要针对每个用户请求(并且这些请求的数量大于50),这变得越来越困难(每个请求创建3Thread)并且资源有限。

请建议我如何实现像Executor服务池这样的设计,其中池中的每个ExceutorServices都有3个线程,并将这些请求委托给ExecutorServices池。
提前谢谢。

2 个答案:

答案 0 :(得分:0)

每个请求都需要从不同的计算机获取数据,并且每个请求创建三个线程。然后,您将合并输出,然后将此响应发送给发出此请求的客户端。如果您有多个处理器或某些任务是面向I / O的,那么使用多线程可能是一个不错的选择。

  

这需要针对每个用户请求执行(并且这些请求大于50英寸)   数字),这变得越来越困难(每个请求创建3Thread)和   资源有限。

为每个客户端请求创建三个线程没有意义。您需要对要一次处理的请求设置一些限制(使用基准测试)。您可以将所有请求保留在队列中,并在每个请求都有自己的ExecutorService时处理该号码。

答案 1 :(得分:0)

  

为此,我们实施了ExcuterServices,如下所示

...  
     

这需要针对每个用户请求(并且这些请求的数量> 50),这变得越来越困难(每个请求创建3Thread)

您是否为每个请求创建了一个新的 pool 线程?如果是这样,那就不要那样做了。只需创建一个全局池,并为每个请求将三个任务提交到池中。如果您预计会有很多请求,那么池的大小(numThreads)应该与可用CPU核心的数量大致相同,如果任务是计算绑定的,或者如果它们将要更多,则可能更多花时间等待I / O. (你必须尝试找到最好的数字。)

另一方面,如果我误解了您的问题,并且您已经 只创建了一个线程池,那么您的问题没有意义:它是修复的线程池。它永远不会超过(或少于)给定的numThreads

  

[如果我使用线程池,那么]我如何才能知道这3个线程是针对请求1而这3个针对请求2 ...?

使用ExecutorService时,您不需要知道执行任务的线程的身份。任务本身应该知道该怎么做。

您提交的每个任务都是实现Callable接口的对象。无论任务需要做什么信息,都应该通过构造函数参数提供给它。

  

...还有我们怎么知道那些特定的三个线程完成了?

每次向Callable提交ExecutorService实例时,都会返回Future个对象。您可以使用Future对象来确定任务是否已完成,等待任务完成,以及访问任务完成时返回的结果。

如果您仍然有疑问,那么在做其他任何事情之前,您可能需要花一些时间来完成Java Tutorial的并发性章节。

http://docs.oracle.com/javase/tutorial/essential/concurrency/