1、线程核心核心类ThreadPoolExecutor

corePollSize:核心线程数,任务提交时,若当运行的线程数小于核心线程数,则启动核心线程运行任务,大于或等于核心线程数则在任务队列中等待
maximumPoolSize:允许运行的最大线程数,如果任务队列满了,且运行线程数小于最大线程数,则会创建非核心线程运行
keepAliveTime:非核心线程超时时间,线程等待时间超过该时间则系统回收该线程,如果设置allowCoreThreadTimeout为True时,超时机制也应用在核心线程上
unit:时间单位,workQueue:任务队列,threadFactory:线程工厂,用来给创建的线程取名,handler:饱和策略,当运行的线程数量大于队列容量加允许运行线程数时,执行该策略,抛异常。

2、线程池分类
1) FixedThreadPool:可重用固定线程数的线程池:

当执行execute方法时,如果当前运行的线程未达到corePoolSize(核心线程数)时就创建核心线程来处理任务,如果达到了核心线程数则将任务添加到LinkedBlockingQueue(无界的阻塞队列)中。FixedThreadPool就是一个有固定数量核心线程的线程池,并且这些核心线程不会被回收。当线程数超过corePoolSize 时,就将任务存储在任务队列中;当线程池有空闲线程时,则从任务队列中去取任务执行。执行长期的任务,性能好很多。
2)CachedThreadPool:是一个根据需要创建线程的线程池

CachedThreadPool没有核心线程,非核心线程是无界的。keepAliveTime设置为60L,则空闲线程等待新任务的最长时间为 60s。在此用了阻塞队列 SynchronousQueue,它是一个不存储元素的阻塞队列,每个插入操作必须等待另一个线程的移除操作,同样任何一个移除操作都等待另一个线程的插入操作。如果提交的任务大于线程池中线程处理任务的速度就会不断地创建新线程。另外,每次提交任务都会立即有线程去处理。所以,CachedThreadPool 比较适于大量的需要立即处理并且耗时较少的任务。
3)singleThreadExecutor:单个线程工作的线程池:

当执行execute方法时,如果当前运行的线程数未达到核心线程数,也就是当前没有运行的线程,则创建一个新线程来处理任务。如果当前有运行的线程,则将任务添加到阻塞队列LinkedBlockingQueue中。因此,SingleThreadExecutor能确保所有的任务在一个线程中按照顺序逐一执行。适用:一个任务一个任务执行的场景
4)scheduledThreadPool:能实现定时和周期性任务的线程池。

当执行 ScheduledThreadPoolExecutor 的 scheduleAtFixedRate 或者 scheduleWithFixedDelay方法时,会向DelayedWorkQueue 添加一个 实现 RunnableScheduledFuture 接口的ScheduledFutureTask(任务的包装类),并会检查运行的线程是否达到 corePoolSize。如果没有则新建线程并启动它,但并不是立即去执行任务,而是去 DelayedWorkQueue 中取ScheduledFutureTask,然后去执行任务。如果运行的线程达到了corePoolSize时,则将任务添加到DelayedWorkQueue中。DelayedWorkQueue会将任务进行排序,先要执行的任务放在队列的前面。其跟此前介绍的线程池不同的是,当执行完任务后,会将ScheduledFutureTask中的time变量改为下次要执行的时间并放回到DelayedWorkQueue中。适用:周期性执行任务的场景。
网友评论