创建线程池时通过设置线程池各项参数可以创建性能各异的线程池
1 | new ThreadPoolExecutor(int corePoolSize, |
但官方也给我们设置好了四种常用的线程池,可以直接调用
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool 可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
1. newCachedThreadPool 可缓存线程池
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
示例代码如下:
1 | package test; |
线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
2. newFixedThreadPool 定长线程池
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:
1 | package test; |
因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。
定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()
3. newScheduledThreadPool 定时线程池
创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:
1 | package test; |
4. newSingleThreadExecutor 单线程线程池
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:
1 | package test; |