java线程池解析
2023-04-02 17:43:10
学过java的人必须知道多线程,多线程该技术主要解决了处理器单元中多线程执行的问题,可以显著减少处理器单元的闲置时间,提高处理器单元的吞吐量。过度的线程也可能导致资源耗尽的风险,此时线程池已成为java中的神来之笔。现在我们来java线程池分析,看看它的独特之处。
线程池的引入便于管理线程任务,降低了资源损失的风险。在jdk1.5开始的java中,涉及线程池的相关类别是jdk1.5.util.concurrent包中涉及的几个核心类别和接口包括:Executor、Executors、ExecutorService、ThreadPoolExecutor、FutureTask、Callable、Runnable等。
线程池可以自动创建或手动创建,自动创建体现在在Executors工具类中,可以创建newfixedthreadPol、newCachedThreadPool、newSingleThreadExecutor、newScheduledThreadPool;每个参数都可以灵活设置线程池,手动创建在代码中,即ThreadPolexecutor类结构器中,各种实参的差异体现在代码中:
public static ExecutorService newFixedThreadPool(int var0) {
return new ThreadPoolExecutor(var0, var0, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue());
}
public static ExecutorService newSingleThreadExecutor() {
return new Executors.FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()));
}
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, 2147483647, 60L, TimeUnit.SECONDS, new SynchronousQueue());
}
public static ScheduledExecutorService newScheduledThreadPool(int var0) {
return new ScheduledThreadPoolExecutor(var0);
}
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {……}
下面给大家介绍一下ThreadPolexecutor中的几个重要参数:
corePoolSize:核心线程数也是线程池中常驻的线程数。当线程池初始化时,默认没有线程。当任务到来时,创建线程执行任务
maximumPoolSize:最大线程数可能会在核心线程数的基础上增加一些非核心线程。需要注意的是,只有当workQueue队列填满时,才会创建比corepolsize更多的线程(线程池总线程数不超过maxpolsize)
keepAliveTime:超过keepalivetime的非核心线程空闲时间将自动终止回收。请注意,当corepolsize=maxpolsize时,kepalivetime参数不起作用(因为没有非核心线程);
unit:keepalivetime时间单位
workQueue:用于保存任务的队列可以是三种无界、有界、同步移交的队列类型之一。当池中的工作线程大于corePolsize时,新任务将被放入队列中
threadFactory:创建线程的工厂类默认使用Executors.defaultThreadFactory()也可以用guava库的ThreadFactoryBuilder来创建
handler:当线程池不能继续接收任务时(队列已满,线程数达到maximunPolsize)的饱和策略,值为AbortPolicy、CallerRunsPolicy、DiscardOldestPolicy、DiscardPolicy
线程在线程池中创建流程图:
workQueue队列:
SynchronousQueue(同步移交队列):队列不作为任务的缓冲模式,可以简单理解为队列长度为零
LinkedBlockingQueue(无界队列):队列长度不受限制。当要求越来越多(任务处理速度跟不上任务处理速度,导致要求积累)时,可能会导致内存占用过多或OOM