9

每次运行程序/应用程序时创建多个执行程序服务什么时候是个好主意?你为什么要这样做,而不是从头executors.newcachedthreadpool()开始并提交所有可调用的。

4

2 回答 2

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

最重要的是,我想不出为什么对于一个足够大的项目,您只想为整个程序使用一个线程池。

于 2012-09-16T23:06:37.640 回答
1

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

请记住,ExecutorService 有几个实现:

  1. 线程池执行器
  2. ScheduledThreadPoolExecutor

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

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

请注意,您也可以传入一个队列,因此您可以控制线程池使用的排队策略。

于 2012-09-16T23:05:19.253 回答