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

Sam*_*msh 7 java

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

ass*_*ias 6

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

总而言之,我想不出一个原因,对于一个足够大的项目,你会想要为整个程序使用一个线程池.


Pau*_*ald 1

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

请记住,ExecutorService 有多种实现:

  1. 线程池执行器
  2. 调度线程池执行器

查看 ThreadPoolExecutor 的构造函数参数,这些都是您可能需要根据您提交的任务类型进行调整的内容:

ThreadPoolExecutor(int corePoolSize, 
   int maximumPoolSize, 
   long keepAliveTime, 
   TimeUnit unit, 
   BlockingQueue<Runnable> workQueue)
Run Code Online (Sandbox Code Playgroud)

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