为什么使用线程池:
1、创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率。
2、线程并发数量过多,抢占系统资源从而导致阻塞。
3、对线程进行一些简单的管理。
在java中,线程池的类为ThreadPoolExecutor,该类提供了四种构造方法:
//五个参数的构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) //六个参数的构造函数-1 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) //六个参数的构造函数-2 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)
方法中的参数:
int corePoolSize 线程池中核心线程大小
在线程池中的线程小于核心线程数时,则新建的线程属于核心线程,否则属于非核心线程。默认情况下,核心线程会一直存货于线程池,即使什么也不做。但如果指定类中的allowCoreThreadTimeOut为true,则核心线程闲置一定时间后也会被销毁,具体时间,由参数指定。
int maximumPoolSize 线程池中最大线程数
线程池中存在的线程数量不会超过最大线程数,如果在达到最大线程数后仍有新的任务需要执行,则会进行排队。
long keepAliveTime 非核心线程的最大存活时间
线程池中的非核心线程处于闲置状态时,则会开始计时,达到指定时间后将被销毁。如果指定参数allowCoreThreadTimeOut为true,则核心线程同样适用。
TimeUnit unit keepAliveTime的单位
类型TimeUnit是枚举类型,包括
NANOSECONDS : 1微毫秒 = 1微秒 / 1000
MICROSECONDS : 1微秒 = 1毫秒 / 1000
MILLISECONDS : 1毫秒 = 1秒 /1000
SECONDS : 秒
MINUTES : 分
HOURS : 小时
DAYS : 天
BlockingQueue<Runnable> workQueue 任务队列
等待执行的Runnable对象。