线程池ThreadPoolExecutor
一、字段含义:
1.corepoolsize:核心池的大小,默认情况下,在创建了线程池之后,线程池中线程数为 0, 当有任务来之后,就会创建一个线程去执行任务,当线程池中线程数达到 corepoolsize 后, 就把任务放在任务缓存队列中。
2.Maximumpoolsize:线程池中最多创建多少个线程。
3.Keeplivetime:线程没有任务执行时,最多保存多久的时间会终止,默认情况下,当线程池中线程数>corepoolsize 时,Keeplivetime 才起作用,直到线程数不大于 corepoolsize。
4.workQueue:阻塞队列,用来存放等待被执行的任务。
workQueue类型为BlockingQueue<Runnable>,有三种类型:
1)ArrayBlockingQueue:基于数组的先进先出队列,此队列创建时需指定大小。
2)LinkedBlockingQueue:基于链表的先进先出队列,如果创建时没有指定此队列大小,则默认为Integer.MAX_VALUE。
3)synchronousQueue:不保存提交的任务,直接新建一个线程来执行新任务,在某次添加元素后必须等待其他线程取走后才继续添加。
5.threadFactory:线程工厂,用来创建线程。
二、线程池处理任务策略
一个线程池管理一组工作线程,还包括一个用于放置等待执行任务的任务队列(阻塞队列),刚创建线程池时,线程池中线程数为0.
当有任务提交到线程池之后的一些操作:
1.若当前线程池中线程数<corePoolSize,则每来一个任务就创建一个线程去执行。
2.若当前线程池中线程数>=corePoolSize,会尝试将任务添加到任务缓存队列workQueue中去,若添 加成功,则任务会等待空闲线程将其取出执行,若添加失败,则尝试创建线程去执行这个任务。
3.若当前线程池中线程数>= MaximumPoolSize,则采取拒绝策略handler(有 4 种,1)abortPolicy 丢弃任务, 抛出 RejectedExecutionException 2 ) discardPolicy 拒绝执行, 不抛异常 3 )discardOldestPolicy 丢弃任务缓存队列中最老的任务,并且尝试重新提交新的任务 4)callerrunsPolicy 有反馈机制,使任务提交的速度变慢)。
ps:在corePoolSize和maximumPoolSize之间的线程数会被自动释放。当线程池中线程数量大于corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止,直至线程池中的线程数目不大于corePoolSize。这样,线程池可以动态的调整池中的线程数。
三、线程池的状态
线程池的状态
1.当线程池创建后,初始为 running 状态。
2.调用 shutdown 方法后,处 shutdown 状态,此时不再接受新的任务,等待已有的任务执行完毕。
3.调用 shutdownnow 方法后,进入 stop 状态,不再接受新的任务,并且会尝试终止正在执行的任务。
4.当处于 shotdown 或 stop 状态,并且所有工作线程已经销毁,任务缓存队列已清空,线程池被设为 terminated 状态。
四、使用线程池的好处
1.通过重复利用已创建的线程,减少在创建和销毁线程上所花的时间以及系统资源的开销。
2.提高响应速度。当任务到达时,任务可以不需要等到线程创建就可以立即执行。
3.提高线程的可管理型。使用线程池可以对线程进行统一的分配和监控。
4.如果不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存。
五、线程池相关类
1.Executor接口
顶层接口,里面只有一个方法execute(Runnable),用来执行传进参数的任务。Executor提供了execute()接口来执行已提交的 Runnable 任务的对象。Executor存在的目的是提供一种将”任务提交”与”任务如何运行”分离开来的机制。
2.ExecutorService接口
ExecutorService继承于Executor。它是”执行者服务”接口,它是为”执行者接口Executor”服务而存在的;准确的话,ExecutorService提供了”将任务提交给执行者的接口(submit方法)”,”让执行者执行任务(invokeAll, invokeAny方法)”的接口等等。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // 请求关闭、发生超时或者当前线程中断,无论哪一个首先发生之后,都将导致阻塞,直到所有任务完成执行。 2 boolean awaitTermination(long timeout, TimeUnit unit) 3 // 执行给定的任务,当所有任务完成时,返回保持任务状态和结果的 Future 列表。 4 <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) 5 // 执行给定的任务,当所有任务完成或超时期满时(无论哪个首先发生),返回保持任务状态和结果的 Future 列表。 6 <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) 7 // 执行给定的任务,如果某个任务已成功完成(也就是未抛出异常),则返回其结果。 8 <T> T invokeAny(Collection<? extends Callable<T>> tasks) 9 // 执行给定的任务,如果在给定的超时期满前某个任务已成功完成(也就是未抛出异常),则返回其结果。 10 <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) 11 // 如果此执行程序已关闭,则返回 true。 12 boolean isShutdown() 13 // 如果关闭后所有任务都已完成,则返回 true。 14 boolean isTerminated() 15 // 启动一次顺序关闭,执行以前提交的任务,但不接受新任务。 16 void shutdown() 17 // 试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。 18 List<Runnable> shutdownNow() 19 // 提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。 20 <T> Future<T> submit(Callable<T> task) 21 // 提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。 22 Future<?> submit(Runnable task) 23 // 提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。 24 <T> Future<T> submit(Runnable task, T result)
3.AbstractExecutorService
AbstractExecutorService是一个抽象类,它实现了ExecutorService接口。 AbstractExecutorService存在的目的是为ExecutorService中的函数接口提供了默认实现。
4.ThreadPoolExecutor
线程池。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // 用给定的初始参数和默认的线程工厂及被拒绝的执行处理程序创建新的 ThreadPoolExecutor。 2 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) 3 // 用给定的初始参数和默认的线程工厂创建新的 ThreadPoolExecutor。 4 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) 5 // 用给定的初始参数和默认被拒绝的执行处理程序创建新的 ThreadPoolExecutor。 6 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) 7 // 用给定的初始参数创建新的 ThreadPoolExecutor。 8 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) 9 10 // 基于完成执行给定 Runnable 所调用的方法。 11 protected void afterExecute(Runnable r, Throwable t) 12 // 如果在保持活动时间内没有任务到达,新任务到达时正在替换(如果需要),则设置控制核心线程是超时还是终止的策略。 13 void allowCoreThreadTimeOut(boolean value) 14 // 如果此池允许核心线程超时和终止,如果在 keepAlive 时间内没有任务到达,新任务到达时正在替换(如果需要),则返回 true。 15 boolean allowsCoreThreadTimeOut() 16 // 请求关闭、发生超时或者当前线程中断,无论哪一个首先发生之后,都将导致阻塞,直到所有任务完成执行。 17 boolean awaitTermination(long timeout, TimeUnit unit) 18 // 在执行给定线程中的给定 Runnable 之前调用的方法。 19 protected void beforeExecute(Thread t, Runnable r) 20 // 在将来某个时间执行给定任务。 21 void execute(Runnable command) 22 // 当不再引用此执行程序时,调用 shutdown。 23 protected void finalize() 24 // 返回主动执行任务的近似线程数。 25 int getActiveCount() 26 // 返回已完成执行的近似任务总数。 27 long getCompletedTaskCount() 28 // 返回核心线程数。 29 int getCorePoolSize() 30 // 返回线程保持活动的时间,该时间就是超过核心池大小的线程可以在终止前保持空闲的时间值。 31 long getKeepAliveTime(TimeUnit unit) 32 // 返回曾经同时位于池中的最大线程数。 33 int getLargestPoolSize() 34 // 返回允许的最大线程数。 35 int getMaximumPoolSize() 36 // 返回池中的当前线程数。 37 int getPoolSize() 38 // 返回此执行程序使用的任务队列。 39 BlockingQueue<Runnable> getQueue() 40 // 返回用于未执行任务的当前处理程序。 41 RejectedExecutionHandler getRejectedExecutionHandler() 42 // 返回曾计划执行的近似任务总数。 43 long getTaskCount() 44 // 返回用于创建新线程的线程工厂。 45 ThreadFactory getThreadFactory() 46 // 如果此执行程序已关闭,则返回 true。 47 boolean isShutdown() 48 // 如果关闭后所有任务都已完成,则返回 true。 49 boolean isTerminated() 50 // 如果此执行程序处于在 shutdown 或 shutdownNow 之后正在终止但尚未完全终止的过程中,则返回 true。 51 boolean isTerminating() 52 // 启动所有核心线程,使其处于等待工作的空闲状态。 53 int prestartAllCoreThreads() 54 // 启动核心线程,使其处于等待工作的空闲状态。 55 boolean prestartCoreThread() 56 // 尝试从工作队列移除所有已取消的 Future 任务。 57 void purge() 58 // 从执行程序的内部队列中移除此任务(如果存在),从而如果尚未开始,则其不再运行。 59 boolean remove(Runnable task) 60 // 设置核心线程数。 61 void setCorePoolSize(int corePoolSize) 62 // 设置线程在终止前可以保持空闲的时间限制。 63 void setKeepAliveTime(long time, TimeUnit unit) 64 // 设置允许的最大线程数。 65 void setMaximumPoolSize(int maximumPoolSize) 66 // 设置用于未执行任务的新处理程序。 67 void setRejectedExecutionHandler(RejectedExecutionHandler handler) 68 // 设置用于创建新线程的线程工厂。 69 void setThreadFactory(ThreadFactory threadFactory) 70 // 按过去执行已提交任务的顺序发起一个有序的关闭,但是不接受新任务。 71 void shutdown() 72 // 尝试停止所有的活动执行任务、暂停等待任务的处理,并返回等待执行的任务列表。 73 List<Runnable> shutdownNow() 74 // 当 Executor 已经终止时调用的方法。 75 protected void terminated()
5.ScheduledExecutorService
ScheduledExecutorService是一个接口,它继承于于ExecutorService。它相当于提供了”延时”和”周期执行”功能的ExecutorService。 ScheduledExecutorService提供了相应的函数接口,可以安排任务在给定的延迟后执行,也可以让任务周期的执行。
6.ScheduledThreadPoolExecutor
它相当于提供了”延时”和”周期执行”功能的ScheduledExecutorService。 ScheduledThreadPoolExecutor类似于Timer,但是在高并发程序中,ScheduledThreadPoolExecutor的性能要优于Timer。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // 使用给定核心池大小创建一个新 ScheduledThreadPoolExecutor。 2 ScheduledThreadPoolExecutor(int corePoolSize) 3 // 使用给定初始参数创建一个新 ScheduledThreadPoolExecutor。 4 ScheduledThreadPoolExecutor(int corePoolSize, RejectedExecutionHandler handler) 5 // 使用给定的初始参数创建一个新 ScheduledThreadPoolExecutor。 6 ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory) 7 // 使用给定初始参数创建一个新 ScheduledThreadPoolExecutor。 8 ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory, RejectedExecutionHandler handler) 9 10 // 修改或替换用于执行 callable 的任务。 11 protected <V> RunnableScheduledFuture<V> decorateTask(Callable<V> callable, RunnableScheduledFuture<V> task) 12 // 修改或替换用于执行 runnable 的任务。 13 protected <V> RunnableScheduledFuture<V> decorateTask(Runnable runnable, RunnableScheduledFuture<V> task) 14 // 使用所要求的零延迟执行命令。 15 void execute(Runnable command) 16 // 获取有关在此执行程序已 shutdown 的情况下、是否继续执行现有定期任务的策略。 17 boolean getContinueExistingPeriodicTasksAfterShutdownPolicy() 18 // 获取有关在此执行程序已 shutdown 的情况下是否继续执行现有延迟任务的策略。 19 boolean getExecuteExistingDelayedTasksAfterShutdownPolicy() 20 // 返回此执行程序使用的任务队列。 21 BlockingQueue<Runnable> getQueue() 22 // 从执行程序的内部队列中移除此任务(如果存在),从而如果尚未开始,则其不再运行。 23 boolean remove(Runnable task) 24 // 创建并执行在给定延迟后启用的 ScheduledFuture。 25 <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) 26 // 创建并执行在给定延迟后启用的一次性操作。 27 ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) 28 // 创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在 initialDelay 后开始执行,然后在 initialDelay+period 后执行,接着在 initialDelay + 2 * period 后执行,依此类推。 29 ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) 30 // 创建并执行一个在给定初始延迟后首次启用的定期操作,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟。 31 ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) 32 // 设置有关在此执行程序已 shutdown 的情况下是否继续执行现有定期任务的策略。 33 void setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean value) 34 // 设置有关在此执行程序已 shutdown 的情况下是否继续执行现有延迟任务的策略。 35 void setExecuteExistingDelayedTasksAfterShutdownPolicy(boolean value) 36 // 在以前已提交任务的执行中发起一个有序的关闭,但是不接受新任务。 37 void shutdown() 38 // 尝试停止所有正在执行的任务、暂停等待任务的处理,并返回等待执行的任务列表。 39 List<Runnable> shutdownNow() 40 // 提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。 41 <T> Future<T> submit(Callable<T> task) 42 // 提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。 43 Future<?> submit(Runnable task) 44 // 提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。 45 <T> Future<T> submit(Runnable task, T result)
7.Executors类
Executors是个静态工厂类。它通过静态工厂方法返回ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 等类的对象。
主要用来创建线程。
1)Executors.newSingleThreadExecutor
创建一个单线程的线程池。将多个任务交给这个 Executor时,这个线程处理完一个任务之后接着处理下一个任务,若该线程出现异常,将会有一个新线程来代替。保证所有任务按提交顺序执行。
2)Executors.newFixedThreadPool
创建一个包含指定数目线程的线程池。每提交一个任务就创建一个线程。若任务数多于线程数目,则没有执行的任务必须等待,直到有任务完成为止。如果某个线程因为执行异常而结束,则线程池会补充一个新线程(保持线程大小不变)。
3)Executors.newCahedThreadPool
创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,就会回收部分空闲(指定时间内不执行任务)的线程,当任务数量增加,线程池会自动添加新线程来处理任务。该线程池不会对线程数加以限制,完全依赖于 JVM 能创建线程的数量,可能引起内存不足。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // 返回 Callable 对象,调用它时可运行给定特权的操作并返回其结果。 2 static Callable<Object> callable(PrivilegedAction<?> action) 3 // 返回 Callable 对象,调用它时可运行给定特权的异常操作并返回其结果。 4 static Callable<Object> callable(PrivilegedExceptionAction<?> action) 5 // 返回 Callable 对象,调用它时可运行给定的任务并返回 null。 6 static Callable<Object> callable(Runnable task) 7 // 返回 Callable 对象,调用它时可运行给定的任务并返回给定的结果。 8 static <T> Callable<T> callable(Runnable task, T result) 9 // 返回用于创建新线程的默认线程工厂。 10 static ThreadFactory defaultThreadFactory() 11 // 创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。 12 static ExecutorService newCachedThreadPool() 13 // 创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们,并在需要时使用提供的 ThreadFactory 创建新线程。 14 static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) 15 // 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。 16 static ExecutorService newFixedThreadPool(int nThreads) 17 // 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程,在需要时使用提供的 ThreadFactory 创建新线程。 18 static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) 19 // 创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。 20 static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 21 // 创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。 22 static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory) 23 // 创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。 24 static ExecutorService newSingleThreadExecutor() 25 // 创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程,并在需要时使用提供的 ThreadFactory 创建新线程。 26 static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) 27 // 创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。 28 static ScheduledExecutorService newSingleThreadScheduledExecutor() 29 // 创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。 30 static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory) 31 // 返回 Callable 对象,调用它时可在当前的访问控制上下文中执行给定的 callable 对象。 32 static <T> Callable<T> privilegedCallable(Callable<T> callable) 33 // 返回 Callable 对象,调用它时可在当前的访问控制上下文中,使用当前上下文类加载器作为上下文类加载器来执行给定的 callable 对象。 34 static <T> Callable<T> privilegedCallableUsingCurrentClassLoader(Callable<T> callable) 35 // 返回用于创建新线程的线程工厂,这些新线程与当前线程具有相同的权限。 36 static ThreadFactory privilegedThreadFactory() 37 // 返回一个将所有已定义的 ExecutorService 方法委托给指定执行程序的对象,但是使用强制转换可能无法访问其他方法。 38 static ExecutorService unconfigurableExecutorService(ExecutorService executor) 39 // 返回一个将所有已定义的 ExecutorService 方法委托给指定执行程序的对象,但是使用强制转换可能无法访问其他方法。 40 static ScheduledExecutorService unconfigurableScheduledExecutorService(ScheduledExecutorService executor)