Java线程池的种类和特点
线程池的主要特点
- 线程复用
- 控制最大并发数
- 管理线程
线程池框架
其底层是ThreadPoolExecutor,然后后面用的时候,都是用的这个工具类Executors。
类似于Collections.xxx这种方式。
JDK提供的5种不同类型的线程池
JDK默认提供了五种不同的线程池的一个创建方式,下面将会分别介绍他们的特点。
1. newCachedThreadPool
它是一种可以缓存的线程池,它可以用来处理大量短期的突发流量。
特点
- 最大线程数是Integer.MaxValue。
- 线程存活时间是60秒。
- 阻塞队列用的是Synchronous-Queue。
Synchronous-Queue是一种不能存储任何元素的阻塞队列。也就是说每提交一个任务到这个队列里面,都需要分配一个工作线程来处理。
因为它的最大线程数没有限制,所以它可以来处理大量的一个任务。
另外每个工作线程又可以存活60秒,所以使得这些工作线程可以缓存起来去应对更多的一个任务的处理。
实现方法
// 可扩容的一池多线程
ExecutorService threadPool = Executors.newCachedThreadPool()
2. newFixedThreadPool
它是一种固定线程数量的线程池。
特点
核心线程和最大线程数量都是一个固定的值。如果任务比较多,工作线程处理不过来,就会加入到阻塞队列里面等待。
实现方法
// 池固定线程数
ExecutorService threadPool = Executors.newFixedThreadPool(int)
3. newSingleThreadExecutor
它是只有一个工作线程的线程池,并且线程数量无法动态更改,因此可以保证所有的任务都按照FIFO的方式顺序执行。
实现方法
// 池一个线程
ExecutorService threadPool = Executors.newSingleThreadExecutor()
3. newScheduledThreadPool
它是一种具有延迟执行功能的线程池,可用它来实现定时调度。
4. newWorkStealingPool
Java8里面新加入的一个线程池,它内部会构建一个ForkJoinPool,利用工作窃取的算法并行处理请求。
实现方法的共同点
这些线程池都是通过JDK里面的一个工具叫Executors来构建的。那么线程池里面的最终实现是一个叫ThreadPoolExecutor。
真实工作中使用的多线程类型
一个都不用,真实开发中是不会直接使用这个工具类来创建线程池的。
用这个工具类创建的线程池底层都是有界队列,但是有界队列的长度实在是太大了,会占用过多的系统资源。
所以我们真实的使用过程都是直接手动new,用ThreadPoolExecutor自己创建。
参考资料: