五种线程池
JUC
newSingleThreadPool
newFixedThreadPool
newCachedThreadPool
newScheduledThreadPool
Spring
ThreadPoolTaskExecutor (BlockingQueue)
execute和submit区别
execute()
用于提交不需要返回值的任务
submit()
用于提交需要返回值的任务
newSingleThreadPool
只有一个线程,就确保所有的任务都在同一个线程中顺序执行
newFixedThreadPool
全是核心线程
即使是空闲状态,线程不会被回收,除非线程池被关闭
使用LinkedBlockingQueue
适用于任务量比较固定但耗时长的任务。
newCachedThreadPool
是非核心线程,其maximumPoolSize设置为Integer.MAX_VALUE,线程可以无限创建
使用SynchronousQueue
这个队列是无法插入任务的,一有任务立即执行
比较适合任务量大但耗时少的任务。
newScheduledThreadPool
这类线程池核心线程数量是固定
它的非核心线程是没有限制的,并且非核心线程一闲置就会被回收核心线程是不会回收
使用DelayedWorkQueue
会将任务排序,按新建一个非核心线程顺序执行,执行完线程就回收
ThreadPoolTaskExecutor
spring为我们提供的线程池
采用BlockingQueue
配合 ConcurrentTaskExecutor保证安全
手动new线程池避免了OOM
网友评论