“Java官方提供了哪几种线程池,分别有什么特点?”
这是一道针对工作3年左右的面试题,你能回答上来吗?
大家好,我是Mic,一个工作了14年的Java程序员
关于这个问题的标准回答,我整理到了一个15W字的面试文档里面,大家可以扫描文章尾端二维码领取。
下面看看高手的回答。
需要高手面试文档面试文档的小伙伴可以扫描文章底部二维码
JDK中幕刃提供了5中不同线程池的创建方式,下面我分别说一下每一种线程池以及它的特点。
newCachedThreadPool, 是一种可以缓存的线程池,它可以用来处理大量短期的突发流量。
它的特点有三个,最大线程数是Integer.MaxValue,线程存活时间是60秒,阻塞队列用的是SynchronousQueue,这是一种不存才任何元素的阻塞队列,也就是每提交一个任务给到线程池,都会分配一个工作线程来处理,由于最大线程数没有限制。
所以它可以处理大量的任务,另外每个工作线程又可以存活60s,使得这些工作线程可以缓存起来应对更多任务的处理。
newFixedThreadPool,是一种固定线程数量的线程池。
它的特点是核心线程和最大线程数量都是一个固定的值如果任务比较多工作线程处理不过来,就会加入到阻塞队列里面等待。
newSingleThreadExecutor,只有一个工作线程的线程池。
并且线程数量无法动态更改,因此可以保证所有的任务都按照FIFO的方式顺序执行。
newScheduledThreadPool,具有延迟执行功能的线程池可以用它来实现定时调度
newWorkStealingPool,Java8里面新加入的一个线程池它内部会构建一个ForkJoinPool,利用工作窃取的算法并行处理请求。
这些线程都是通过工具类Executors来构建的,线程池的最终实现类是ThreadPoolExecutor。
这个问题考察大家对于线程池的基本认识。
平时使用得比较少的同学可以好好学习一下线程池的底层原理然后再去理解JDK官方提供的几个线程池的实现。
就可以随时回答出这个问题了。
另外,我将所有Java面试系列制作成了完整的面试文档。它的便捷之处在于,可以通过检索的方式,找到你想要的面试题,目前已经更新180期,总计超过15W字!