Java线程池的种类及真实开发中常用的创建方式

线程池的主要特点

  1. 线程复用
  2. 控制最大并发数
  3. 管理线程

线程池框架

其底层是ThreadPoolExecutor,然后后面用的时候,都是用的这个工具类Executors。

类似于Collections.xxx这种方式。

JDK提供的5种不同类型的线程池

JDK默认提供了五种不同的线程池的一个创建方式,下面将会分别介绍他们的特点。

1. newCachedThreadPool

它是一种可以缓存的线程池,它可以用来处理大量短期的突发流量

特点

  1. 最大线程数是Integer.MaxValue。
  2. 线程存活时间是60秒。
  3. 阻塞队列用的是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自己创建

参考资料

  1. 【Java面试】精讲!面试被问Java官方提供了哪几种线程池
  2. 【Java面试必问】【多线程开发必用JUC】学姐带你学Java并发包-JUC
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值