Java线程池
一、线程池的组成部分
线程池的核心类是ThreadPoolExecutor,查看其构造函数,参数最多的构造函数包含这几个部分
int corePoolSize:核心池大小
int maximumPoolSize:最大线程池大小
long keepAliveTime:线程空闲时任保留等待新任务提交的时间
TimeUnit unit:等待时间的单位
BolckingQueue<runnable> workQueue:工作队列,用于存储提交的新任务
ThreadFactory threadFactory:线程工厂,用于创建线程
RejectExecutionHandler handler:任务被拒绝执行时的处理方式,有四种:1.拒绝任务,抛出异常 2.直接丢弃任务 3.循环丢弃等待队列中最老的任务,并尝试提交该被拒绝的任务 4.将任务给主线程来执行
二、常用的Java线程池有哪几种
newCachedThreadPool():用来处理大量短时间工作的线程池,会试图缓存线程并进行重用,当无缓存线程可用时,会创建新的线程,当线程闲置超过60s(默认),则会终止线程并移除缓存
newFixedThreadPoolint (int nThreads):定长的线程池,任何时候最多只有nThreads个线程是活动的
newSingleThreadExecutor():工作线程数目限制为1,保证所有任务都顺序执行
newSingleThreadScheduledExecutor()/newScheduledThreadPoo(int corePoolSize):可以进行定时和周期性的调度
newWorkStealingPool(int parallelism):Java8新提供的方法,利用Work-Stealing算法,并行得处理任务
三、一个新任务提交到线程池,线程池的处理流程是什么样的
首先,判断线程数是否达到corePoolSize
如果未达到,则创建一个新的线程执行任务
如果已经达到,判断工作队列是否已满
如果未满,则将新任务提交到工作队列中
如果已满,判断线程数是否达到maximumPoolSize
如果未达到,则创建新的线程执行该任务
如果已经达到,则拒绝该任务,根据对应的handler进行处理
四、使用线程池有什么好处
1.减少创建线程和销毁线程的开销
2.任务提交后立刻有线程可以执行,加快执行速度
3.提供一些调度的方法

浙公网安备 33010602011771号