在日常开发过程中,为了提高应用的处理性能,充分利用计算机的硬件资源,我们经常会使用到多线程。通常情况下,来一个任务就新建一个线程去处理,这种方式简单直接,但存在一些问题:
-
线程的创建和销毁需要一定成本,频繁的创建销毁会造成额外的系统开销
-
线程数量不可控,因为线程数和任务数挂钩,当大量任务蜂拥而至就会创建大量线程,很可能导致系统内存溢出
-
线程的执行本身是基于时间片轮询调度,当线程数量过多,就会频繁的进行上下文切换造成性能损耗,得不偿失
如果一个线程能被复用,在处理完一个任务后继续去处理下一个任务而不是直接被销毁,那问题是不是就迎刃而解了?由此,我们引入了线程池。
1、线程池的创建
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue);
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory);
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler);
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
如上,ThreadPoolExecutor提供了4个构造器方法,查看源码不难发现,实际上最终都调的第四个构造方法,那我们先来理解一下各入参的含义。
corePoolSize:核心线程数大小,核心