程序员的公众号:源1024,获取更多资料,无加密无套路!
最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》,《Java并发编程实战》等等
获取方式: 关注公众号并回复 电子书 领取,更多内容持续奉上
线程池的创建方式主要有以下几种:
-
Executors.newFixedThreadPool:创建一个固定大小的线程池,可控制线程最大并发数,超出的线程会在队列中等待;
-
Executors.newCachedThreadPool:创建一个可缓存的线程池,若线程数超过处理需要,缓存一段时间后会回收,若线程数不够,则新建线程;
-
Executors.newSingleThreadExecutor:它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
-
Executors.newScheduledThreadPool:创建一个可以执行定时或周期性任务的线程池;
-
Executors.newSingleThreadScheduledExecutor:创建一个单线程的可以执行延迟任务的线程池;
-
Executors.newWorkStealingPool:创建一个抢占式执行的线程池(任务执行顺序不确定)。
-
ThreadPoolExecutor:最原始的创建线程池的方式,主要设置 7 个参数。
public ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler
) {
}
corePoolSize
核心线程数,线程池中始终存活的线程数。
maximumPoolSize
最大线程数,线程池中允许的最大线程数,当线程池的任务队列满了之后可以创建的最大线程数。
keepAliveTime
最大线程数可以存活的时间,当线程中没有任务执行时,最大线程就会销毁一部分,最终保持核心线程数量的线程。
unit
单位,用于设定线程的存活时间。
workQueue
阻塞队列,用来存储线程池等待执行的任务,均为线程安全,包含以下 7 种类型:
ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。
LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列。
SynchronousQueue:一个不存储元素的阻塞队列,即直接提交给线程不保持它们。
PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。
DelayQueue:一个使用优先级队列实现的无界阻塞队列,只有在延迟期满时才能从中提取元素。
LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。与SynchronousQueue类似,还含有非阻塞方法。
LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。
threadFactory
线程工厂,主要用来创建线程,默认为正常优先级、非守护线程。
handler
拒绝策略,拒绝处理任务时的策略,包含以下几种类型:
AbortPolicy:拒绝并抛出异常,默认策略。
CallerRunsPolicy:使用当前调用的线程来执行此任务。
DiscardOldestPolicy:抛弃队列头部(最旧)的一个任务,并执行当前任务。
DiscardPolicy:忽略并抛弃当前任务。
系列文章索引
MyBatis的插件能在哪些地方进行拦截?
了解MyBatis的缓存机制吗
面试官:谈谈对volatile的理解
Spring中用到了哪些设计模式
面试官:说一下SQL的执行过程
线程池的工作原理