线程池创建方式

news/2024/11/15 16:47:15/文章来源:https://www.cnblogs.com/hld123/p/18536880

线程池创建方式

   一、方式一:通过ThreadPoolExecutor构造函数来创建(推荐)

   方式二:通过 Executor 框架的工具类 Executors 来创建。

   Executors工具类提供的创建线程池的方法如下图所示:

   可以看出,通过Executors工具类可以创建多种类型的线程池,包括:

   1.  FixedThreadPool:固定线程数量的线程池。该线程池中的线程数量始终不变。当有一个新的任务提交时,线程池中若有空闲线程,则立即执行。若没有,则新的任务会被暂存在一个任务队列中,待有线程空闲时,便处理在任务队列中的任务。

   2. SingleThreadExecutor

   只有一个线程的线程池。若多余一个任务被提交到该线程池,任务会被保存在一个任务队列中,待线程空闲,按先入先出的顺序执行队列中的任务。

   3. CachedThreadPool: 可根据实际情况调整线程数量的线程池。线程池的线程数量不确定,但若有空闲线程可以复用,则会优先使用可复用的线程。若所有线程均在工作,又有新的任务提交,则会创建新的线程处理任务。所有线程在当前任务执行完毕后,将返回线程池进行复用。

   4. ScheduledThreadPool

   给定的延迟后运行任务或者定期执行任务的线程池。

 《阿里巴巴 Java 开发手册》强制线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 构造函数的方式,这样的处理方式让开发同学更加明确线程池的运行规则,规避资源耗尽的风险。

   Executors 返回线程池对象的弊端如下(后文会详细介绍到):

   1.  FixedThreadPool 和 SingleThreadExecutor

   使用的是无界的 LinkedBlockingQueue,任务队列最大长度为 Integer.MAX_VALUE,可能堆积大量的请求,从而导致 OOM。

   部分源码如下:

// 无界队列 LinkedBlockingQueue
public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());}// 无界队列 LinkedBlockingQueue
public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));}

   2. CachedThreadPool

   使用的是同步队列SynchronousQueue, 允许创建的线程数量为 Integer.MAX_VALUE ,如果任务数量过多且执行速度较慢,可能会创建大量的线程,从而导致 OOM。

// 同步队列 SynchronousQueue,没有容量,最大线程数是 Integer.MAX_VALUE`
public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());}

   3. ScheduledThreadPool 和 SingleThreadScheduledExecutor

   使用的无界的延迟阻塞队列 DelayedWorkQueue,任务队列最大长度为 Integer.MAX_VALUE,可能堆积大量的请求,从而导致 OOM。

// DelayedWorkQueue(延迟阻塞队列)
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {return new ScheduledThreadPoolExecutor(corePoolSize);
}
public ScheduledThreadPoolExecutor(int corePoolSize) {super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,new DelayedWorkQueue());
}

 

 


  参考链接:

  https://javaguide.cn/java/concurrent/java-thread-pool-summary.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/829355.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML基础练习

注意:全卷满分140+45分,时间40分钟。 全开卷,并允许联网查询。 凡是标注“不定项”的,每个选项均分总分,每错选或漏选一个均仅扣除该项得分。例如8分4选项题,答案为AD,选ABD得6分,A得6分,AB得4分。 所有题目均为人工阅卷,不需要特别遵守格式规范,均按照答案酌情给分…

将URDF模型文件导入Issac_Gym系列【1】

1 在solidworks中导出URDF文件 1 这里按照古月居老师的要求进行基本的配置 https://www.bilibili.com/video/BV1Tx411o7rH/?vd_source=fcddcf87e97b17fd530dc88db643aab3 关于catkin_ws这种ROS的工作环境的配置,具体可以参考我的这篇博客 https://www.cnblogs.com/myleaf/p/1…

SpringMVC 学习笔记

概述 SpringMVC 中的 MVC 即模型-视图-控制器,该框架围绕一个 DispatcherServlet 改计而成,DispatcherServlet 会把请求分发给各个处理器,并支持可配置的处理器映射和视图渲染等功能 SpringMVC 的工作流程如下所示:客户端发起 HTTP 请求:客户端将请求提交到 DispatcherSer…

VMware vSphere 6.7 Update 3w 下载

VMware vSphere 6.7 Update 3w 下载VMware vSphere 6.7 Update 3w 下载 ESXi 6.7 U3 & vCenter Server 6.7 U3, Dell, HPE, LENOVO, Inspur Custom Image 请访问原文链接:https://sysin.org/blog/vmware-vsphere-6/ 查看最新版。原创作品,转载请保留出处。 作者主页:sys…

HER304-ASEMI轴向高效恢复二极管HER304

HER304-ASEMI轴向高效恢复二极管HER304编辑:ll HER304-ASEMI轴向高效恢复二极管HER304 型号:HER304 品牌:ASEMI 封装:DO-27 特性:轴向高效恢复二极管 正向电流:3A 反向耐压:300V 恢复时间:35ns 引脚数量:2 芯片个数:2 芯片尺寸:MIL 浪涌电流:125A 漏电流:10ua 工作…

Blender 常用修改器

修改器的好处是,它是一个非破坏性的建模方式,方便修改和撤销表面细分修改器 将网格的面分割成更小的面,使其看起来更光滑,但它的顶点并不会受到影响实体修改器 获取任意网格的表面,然后为之添加深度,使其变厚,偏移量可以决定它朝哪边偏移倒角修改器 宽度是坡口形成的两条…

LIN总线

LIN总线 参考链接:https://www.renesas.cn/zh/document/apn/904591?language=zh LIN 是 Local Interconnect Network 的缩写,是基于 UART/SCI(Universal Asynchronous Receiver-Transmitter / Serial Communication Interface,通用异步收发器/串行通信接口)的低成本串行通信…

Nuxt.js 应用中的 listen 事件钩子详解

title: Nuxt.js 应用中的 listen 事件钩子详解 date: 2024/11/9 updated: 2024/11/9 author: cmdragon excerpt: 它为开发者提供了一个自由的空间可以在开发服务器启动时插入自定义逻辑。通过合理利用这个钩子,开发者能够提升代码的可维护性和调试能力。注意处理性能、错误和…

vmware虚拟机更改名字

vmware 虚拟机更改名字,vmware虚拟机安装目录最少文件我安装的时候起名字为 debian1260,后来想改为 debian12gui,我把虚拟机安装目录中的其他文件全都删除,只保留这三个文件。然后把名字改一下,vmx 文本文件中的名字替换一下,双击虚拟机 vmx 文件打开即可。有了计划记得推…

Vanity Intermediate 统配符提权

nmap扫描 ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.167.234 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-09 03:59 UTC Stats: 0:01:22 elapsed; 0 hosts completed (1 up), 1 undergoing Traceroute Traceroute Timing: About 32.26% done; ETC: 04:00 …

C++ exception 异常类继承关系

▲ https://blog.csdn.net/m1059247324/article/details/116228823

Python代码文件不只是“.py”

今天同事给我扔了一个.pyd文件,说让我跑个数据。然后我就傻了。。不知道多少粉丝小伙伴会run.pyd代码文件?如果你也懵懵的,请继续往下读吧。。 今天科普下各类Python代码文件的后缀,给各位Python开发“扫扫盲”。 .py 最常见的Python代码文件后缀名,官方称Python源代码文件…