为什么要引入线程池
-
降低资源消耗:通过重复利用已创建的线程降低创建和销毁造成的消耗。
-
提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。
-
提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
默认线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 100, 10, TimeUnit.SECONDS, new PriorityBlockingQueue<Runnable>());
for(int index=0; index=100; index++){
executor.execute(new Runnable());
}
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
参数 |
说明 |
corePoolSize |
线程池中核心线程数量 |
maximumPoolSize |
最大能创建的线程数量 |
keepAliveTime |
非核心线程最大存活时间 |
unit |
keepAliveTime的时间单位 |
workQueue |
等待队列。当任务提交时,如果线程池中的线程数量大于等于corePoolSize的时候,把该任务放入等待队列
|
threadFactory |
线程创建工厂。默认使用Executors.defaultThreadFactory()来创建线程,线程具有相同的NORM_PRIORITY优先级并且是非守护线程 |
handler |
线程池的饱和拒绝策略。如果阻塞队列满了并且没有空闲的线程,这时如果继续提交任务,就需要采取一种策略处理该任务。 |
Executors提供的线程池
//单一线程数,同时只有一个线程存活,但线程等待队列无界
Executors.newSingleThreadExecutor();
//线程可复用线程池,核心线程数为0,最大可创建的线程数为Interger.max,线程复用存活时间是60s.
Executors.newCachedThreadPool();
//固定线程数量的线程池
Executors.newFixedThreadPool(int corePoolSize);
//可执行定时任务,延迟任务的线程池
Executors.newScheduledThreadPool(int corePoolSize);
关键函数
void execute(Runnable run)//提交任务,交由线程池调度
void shutdown()//关闭线程池,等待任务执行完成
void shutdownNow()//关闭线程池,不等待任务执行完成
int getTaskCount()//返回线程池找中所有任务的数量
int getCompletedTaskCount()//返回线程池中已执行完成的任务数量
int getPoolSize()//返回线程池中已创建线程数量
int getActiveCount()//返回当前正在运行的线程数量
状态流转
execute提交任务