七种线程池
java通过工具类Executors
种各种线程池的工厂方法创建
所有线程池都可使用ExecutorService
接口的引用承接(因为是实现的啊)
(1)CachedThreadPool
Exectors.newCachedThreadPool
- 无长度限制,
- 当新任务加入
CachedThreadPool
时。如果池内其他线程无空闲就产生新的线程执行任务,如果空闲就使用空闲的线程执行任务 - 线程空闲超过一定时间(默认60s,可设置)自动从池中删除
- 可能会造成内存溢出,一般用
FixedThreadPool
代替
(2)FixedThreadPool
Exectors.newFixedThreadPool(线程数量)
- 固定线程数量
- 如果加入任务时线程均不空闲,该任务加入等待队列,当有线程空闲时从等待队列弹出,由刚刚空闲出的线程执行
- 定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()
(3)ScheduledThreadPool
Executors.newScheduledThreadPool(线程数)
,返回ScheduledExecutorService
类型- 定长
- 定时及周期性执行任务
- 它会不断重复执行任务,而不是执行了线程数就停
ScheduledThreadPool实例.scheduleAtFixedRate(
() -> {
执行任务
},
执行第一个任务之前等待的时间,
每多少秒启动下一个线程执行此任务,
时间单位
);
(4)SingleThreadExecutor
Executors.newSingleThreadExecutor()
- 容量为
1
,只用一个线程工作 - 多余的任务放入队列
- 任务可以按照指定顺序执行(FIFO,LIFO,优先级)
(5)SingleThreadScheduledExecutor
- 只有一个线程,可以放入多个任务
- 这一个线程通过调度执行这些任务
- 调度类似一个CPU调度多线程执行
- 这也就说明了,当线程中一个任务被阻塞时,整个线程都是被阻塞的
- 示例代码1
public class newSingleThreadScheduledExecutor { private static final ScheduledExecutorService excutor = Executors.newSingleThreadScheduledExecutor(); public static void