newCachedThreadPool
缓存线程池,可无限大
CorePoolSize 核心线程 0
MaximumPoolSize 最大线程 max
keepAliveTime:60L
SynchronousQueue 队列 其实只有一个在排队 一个worker进来之后从队列取出一个
newFixedThreadPool
这是一种固定线程数的线程池,当前线程数大于总数则会等待
CorePoolSize 核心线程 10
MaximumPoolSize 最大线程 10
keepAliveTime:0
LinkedBlockingQueue 没有规定大小 会扩大很多 占用内存
newSingleThreadExecutor
单线程线程池
CorePoolSize 核心线程 1
MaximumPoolSize 最大线程 1
keepAliveTime:0
LinkedBlockingQueue 没有规定大小 会扩大很多 占用内存
为什么阿里不推荐使用以上三种
因为LinkedBlockingQueue默认没有设置队列大小,如果数据量很大会创建很大的队列占用内存
可以使用自定义线程池
自定义线程池: ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 20, 2 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(10));//自定义线程
以上java自带的三个线程池都实现了ThreadPoolExecutor
ThreadPoolExecutor内部有实现4个拒绝策略:
(1)、CallerRunsPolicy,由调用execute方法提交任务的线程来执行这个任务;
(2)、AbortPolicy,抛出异常RejectedExecutionException拒绝提交任务;
(3)、DiscardPolicy,直接抛弃任务,不做任何处理;
(4)、DiscardOldestPolicy,去除任务队列中的第一个任务(最旧的),重新提交;