「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 20, 2, TimeUnit.MINUTES, new SynchronousQueue<>(), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
-
int corePoolSize(核心线程池大小):如果调用了ThreadPoolExecutor的prestartAllCoreThreads()方法,线程池会提前创建并启动所有核心线程(core thread) -
int maximumPoolSize(最大线程池大小):线程池允许创建的最大线程数。阻塞队列满了之后,就会去创建新线程,且创建之后线程数小于最大线程数,线程池才会去执行任务。但是如果阻塞队列使用的是无界队列,该参数就不会有效果,毕竟阻塞队列都是无界(没有边界)。 -
long keepAliveTime(空闲线程的存活时间):线程池中的线程空闲之后,可以存活的时间,如果过了这个时间,线程就会被销毁。如果任务很多,每个任务执行时间比较短,可以相对的调大keepAliveTime,可以提高线程的利用率。 -
TimeUnit unit(keepAliveTime的时间单位):时分秒,毫秒和微秒等时间单位。 -
BlockingQueue<Runnable> workQueue()(任务队列,阻塞队列):用于保存等待执行的任务的阻塞队列。在jdk中有几个阻塞队列的实现:- ArrayBlockingQueue:基于数组实现的有界阻塞队列。按照先进先出(FIFO)的原则对进来的元素进行排序。
- LinkedBlockingQueue:基于链表实现的游街队列,也是拥有先进先出的队列特性。吞吐量高于ArrayBlockingQueue。
- SynchronoutQueue:同步队列,不存储元素的阻塞队列。每插入一个元素必须等到该元素被取出,否则插入操作会被一直阻塞,吞吐量同通常高于LinkedBlockingQueue。
- PriorityBlockingQueue:具有优先级的无限阻塞队列。
-
ThreadFactory threadFactory(线程工厂):可以通过线程工厂给每个创建出来的线程设置名字。 -
RejectedExecutionHandler handler(拒绝执行的处理器):当队列和线程池都已经满了,那么线程池必须采用一种拒绝策略来处理还在被提交过来的新任务。默认使用的拒绝策略是AbortPolicy,该策略在处理新任务时会直接抛出异常。jdk中线程池框架提供了四种决绝策略:- AbortPolicy:直接抛出异常。
- CallerRunsPolicy:任务返回给调用者所在线程来执行。
- DiscardOldestPolicy:对其队列中最近的一个任务,并执行当前任务。
- DiscardPolicy:不处理任务,直接丢弃。
如果这四种决绝策略不满足,可以实现RejectedExecutionHandler 接口自定自己的拒绝策略。
线程的执行
往ThreadPoolExecutor中提交任务有两个方法:execute()和submit()。
线程池的关闭
可以通过调用ThreadPoolExecutor的shutdown或shutdownNow方法来关闭线程池。
shutdownNow首先将线程池的状态设置成STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表,而shutdown只是将线程池的状态设置成SHUTDOWN状态,然后中断所有没有正在执行任务的线程。
监控线程池
可以通过一下的一些方法来获取线程池的运行信息:
- taskCount:线程池需要执行的任务数量。
- completedTaskCount:线程池在运行过程中已完成的任务数量,小于或等于taskCount。
- largestPoolSize:线程池里曾经创建过的最大线程数量。通过这个数据可以知道线程池是否曾经满过。如该数值等于maximumPoolSize,表示线程池曾经满过。
- getPoolSize:线程池的线程数量。如果线程池不销毁的话,线程池里的线程不会自动销毁,所以这个大小只增不减。
- getActiveCount:获取活动的线程数。
另外,也可以通过扩展线程池进行监控。可以通过继承线程池来自定义线程池,重写线程池的beforeExecute、afterExecute和terminated方法,也可以在任务执行前、执行后和线程池关闭前执行一些代码来进行监控。例如,监控任务的平均执行时间、最大执行时间和最小执行时间等。