FixedThreadPool和ThreadPoolTask​​Executor有什么区别?

Gdg*_*ers 8 java spring multithreading threadpool

使用以下配置配置线程池之间是否有区别:

Executors.newFixedThreadPool(50);
Run Code Online (Sandbox Code Playgroud)

与做:

ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(50);
executor.setThreadNamePrefix("thread-pool");
executor.initialize();
Run Code Online (Sandbox Code Playgroud)

我对在运行时配置线程池不感兴趣(我认为这是使用的主要驱动程序ThreadPoolTaskExecutor)。

mic*_*alk 6

ThreadPoolTaskExecutor是Spring Framework的类。另一方面,Executors::newFixedThreadPool创建ThreadPoolExecutor来自标准Java 的标准线程池,并且从Java 5开始可用。

ThreadPoolTask​​Executor的文档中:

允许配置ThreadPoolExecutorin Bean样式的JavaBean (通过其“ corePoolSize”,“ maxPoolSize”,“ keepAliveSeconds”,“ queueCapacity”属性)并将其作为Spring公开TaskExecutor

....

此类实现Spring的TaskExecutor接口以及该Executor接口,前者是主要接口,另一个仅是辅助便利。因此,异常处理遵循TaskExecutor合同而不是Executor合同,尤其是关于TaskRejectedException

请注意,ThreadPoolTaskExecutor实现了许多春天接口喜欢 AwareBeanNameAwareDisposableBeanInitializingBean这使得它更容易地工作,作为一个Spring bean这样的游泳池。

还可以看看Karol Dowbecki的答案,该答案正确指出了这些池参数上的差异。


Kar*_*cki 5

在您的例子Spring的ThreadPoolTaskExecutor将创建一个ThreadPoolExecutorcorePoolSize50,maxPoolSizeInteger.MAX_VALUEkeepAlive60秒

同时Executors.newFixedThreadPool(50)corePoolSize和设置maxPoolSize为50 keepAlive秒和0秒(请参阅Java源代码)。