为什么要使用线程池?
- 线程缺乏统一管理,占用过多系统资源
- 缺乏更多功能,如定时执行、定期执行等
使用线程池的好处:
- 重用存在的线程,减少对象创建、消亡的开销
- 有效控制最大并发数,提高系统资源使用率
- 定时执行、定期执行
线程池所在包:java.util.concurrent
顶级接口是Executor,真正的线程池接口是ExecutorService【他们两个是继承关系】
AbstractExecutorService 实现类实现了前面的方法
java.util.concurrent.Executors类提供创建线程池的静态方法
方法名 | 说明 |
newCachedThreadPool() | 创建一个可缓存的线程池,有任务时才创建新任务,还可以回收空闲的线程 |
newSingleThreadExecutor() | 创建一个单线程池,这个线程池中只有一个线程,如果有多余的线程要排队等待 |
newFixedThreadPool (int nThreads) | 创建一个固定长度的线程池,空闲线程会一直保留。参数nThreads设定线程池中线程的数目 |
newScheduledThreadPool (int corePoolSize) | 创建了一个固定长度的线程池,而且可以以延迟或定时的方式来执行任务 |
ScheduledExecutorService中的方法:
scheduleAtFixedRate(Runnable command, long initialDelay,long period, TimeUnit unit)
command:要执行的任务
initialDelay:延迟第一次执行的时间
period:连续执行之间的时期
unit:initialDelay和period参数的时间单位
scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
command:要执行的任务
initialDelay:延迟第一次执行的时间
delay:一个执行终止与下一个执行的开始之间的延迟
unit:initialDelay和delay参数的时间单位
ThreadPoolExecutor类:
构造器中各个参数的含义:
- corePoolSize:核心池的大小(线程池中的核心线程数)
- maximumPoolSize:线程池最大线程数(不能超出)
- keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止
- unit:参数keepAliveTime的时间单位
- workQueue:一个阻塞队列,用来存储等待执行的任务
- threadFactory:线程工厂,主要用来创建线程
- handler:表示当拒绝处理任务时的策略(销毁数据)