跳到主要内容

打造专属线程池让并发处理更高效

介绍

线程池是一种在程序执行过程中用于管理和复用线程的技术,它可以有效地减少在创建和销毁线程时所需的开销,并且可以控制并发线程的最大数量,提高系统资源的利用率和程序的稳定性。

在Java中,线程池主要通过 ThreadPoolExecutor 实现类来实现。而在此类的父接口 ExecutorService 提供了封装的线程池功能,比如任务提交、线程池管理(启动、关闭)等。

线程池工作原理是,当提交一个任务时,如果线程池从来没有执行过任务,那么会创建新的线程来执行此任务。如果之前执行任务的话,则会使用已有的空闲核心线程来执行该任务,如果正在执行的任务数量超过了核心线程数的话,新的任务会被放入队列中等待执行。如果此时任务很多,队列的容量也已经放不下的话,就会创建新的线程来处理任务。如果线程数已达到了最大线程参数的值,那么就要执行拒绝策略。

关于线程池的详细介绍和原理解析部分,可跳转到相应文档查询

技术精华-超详细的线程池原理解析

看这里,我们再看一下使用Executors提供的线程池的问题

public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}


public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}


public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}

public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue());
}

以上是Executors提供的常用的几种封装好的线程池,这几种需要注意

  1. newFixedThreadPool , newSingleThreadExecutor 阻塞队列长度为Integer.MAX_VALUE
  2. newCachedThreadPool 最大线程数为Integer.MAX_VALUE
  3. newScheduledThreadPool 最大线程数为Integer.MAX_VALUE

阿里开发规范手册中不建议使用提供这几种线程池,建议是自己实现ThreadPoolExecutor来实现线程池

而在此组件中,对 ThreadPoolExecutor 进行了完整的实现,设计出了功能完整的线程池,接下来我们来详细介绍此组件

付费内容提示

该文档的全部内容仅对「JavaUp项目实战&技术讲解」知识星球用户开放

加入星球后,你可以获得:

  • 超级八股文:100万+字的全栈技术知识库,涵盖技术核心、数据库、中间件、分布式等深度剖析的讲解
  • 讲解文档:黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的从0到1的550+详细文档
  • 讲解视频:黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的核心业务详细讲解
  • 1 对 1 解答:可以对我进行1对1的问题提问,而不仅仅只限于项目
  • 针对性服务:有没理解的地方,文档或者视频还没有讲到可以提出,本人会补充
  • 面试与简历指导:提供面试回答技巧,项目怎样写才能在简历中具有独特的亮点
  • 中间件环境:对于项目中需要使用的中间件,可直接替换成我提供的云环境
  • 面试后复盘:小伙伴去面试后,如果哪里被面试官问住了,可以再找我解答
  • 远程的解决:如果在启动项目遇到问题,本人可以帮你远程解决
进入星球后,即可享受上述所有服务,保证不会再有其他隐藏费用。
知识星球二维码

1. 打开微信 -> 扫描左侧二维码 -> 加入「JavaUp项目实战&技术讲解」知识星球

2. 查看星球使用指导,获取完整项目讲解资料索引

👉 点击解锁全部付费内容
🎁优惠