何时为每个应用程序创建多个执行程序服务java

时间:2012-09-16 22:59:00

标签: java

每次运行程序/应用程序时,何时创建多个执行程序服务是个好主意?你为什么要这样做,而不是在开始时启动executors.newcachedthreadpool()并向其提交所有的callables。

2 个答案:

答案 0 :(得分:5)

  • 您可能需要不同的风格(比如固定的线程池或预定的执行程序)
  • 封装:如果某个特定类需要通过执行程序运行,那么这个类有责任决定其执行策略,这是一个实现细节
  • 专业化 - 前一点的必然结果:
    • 某些任务需要很多线程(通常是网络任务)
    • 而其他人只需要一些(CPU绑定的任务)
    • ,有些应该只使用一个(例如,如果您在本地硬盘上读/写)
  • 在某些情况下,您希望将执行程序传递给对象,因为您希望调用代码控制某些任务的执行方式

总而言之,我无法想到一个原因,对于一个足够大的项目,你只想在整个程序中使用一个线程池。

答案 1 :(得分:1)

添加执行程序服务的典型用例是,您希望服务使用不同的线程池策略,或者具有两种不同的池大小。您的应用程序可能包含一类您想要提交给大型固定大小池的可运行程序,以及另一种可能需要较小池的可运行程序。

请记住,ExecutorService有几个实现:

  1. ThreadPoolExecutor
  2. ScheduledThreadPoolExecutor
  3. 看看ThreadPoolExecutor的构造函数参数,根据您提交的任务类型,这些是您可能想要调整的所有内容:

    ThreadPoolExecutor(int corePoolSize, 
       int maximumPoolSize, 
       long keepAliveTime, 
       TimeUnit unit, 
       BlockingQueue<Runnable> workQueue)
    

    请注意,您还可以传入队列,以便控制线程池使用的排队策略。