使用线程池,可以重用线程,减少创建、销毁新线程带来的性能开销,相对管理线程方便。
Executor
Executor 是一个接口,线程池的现实是由ThreadPoolExecutor完成
corePoolSize:核心线程数,一般会在线程池中存活
maximumPoolSize:最大线程数,超过此值,会来的线程任务会阻塞
keepAliveTime:非核心线程闲置时长,超过会被回收
unit:keepAliveTime的单位
workQueue:任务队列
threadFactory:线程工厂,
1.当池子大小小于corePoolSize就新建线程,并处理请求
2.当池子大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去从workQueue中取任务并处理
3.当workQueue放不下新入的任务时,新建线程入池,并处理请求,如果池子大小撑到了maximumPoolSize就用RejectedExecutionHandler来做拒绝处理
4.另外,当池子的线程数大于corePoolSize的时候,多余的线程会等待keepAliveTime长的时间,如果无请求可处理就自行销毁
FixedThreadPool
ExecutorService executorService1= Executors.newFixedThreadPool(5);
创建的是一个线程固定的线程池,当线程处于空闲时,不会回收,线程池关闭,回收所有线程,当任务超过活跃线程数量会阻塞
SingleThreadExecutor
ExecutorService executorService4 = Executors.newSingleThreadExecutor();
线程池内部只有一个核心线程,所有任务都在同一线程中顺序执行
CachedThreadPool
ExecutorService executorService2 = Executors.newCachedThreadPool();
线程数量不定,只有非核心线程,当线程池中的线程都活跃时会新建线程,否则利用空闲线程。线程池中的空闲线程超时60s,就会被会收
ScheduledThreadPool
ScheduledThreadPool 继承ThreadPoolExecutor
ExecutorService executorService3 = Executors.newScheduledThreadPool(5);
核心线程数量固定,当非核心线程闲置时立即回收,主要用于定时任务和固定周期的重复任务