线程池的构造方式

news2024/11/20 7:20:40

线程池的构造方式

  • 两类构造方式
  • 7种实现方法
  • 7种线程池的具体使用
    • FixedThreadPool
    • CachedThreadPool
    • SingleThreadExecutor
    • ScheduledThreadPool
    • SingleThreadScheduledExecutor
    • newWorkStealingPool
    • ThreadPoolExecutor
  • 说明
  • 总结

两类构造方式

在Java语言中,并发编程都是通过创建线程池来实现的。

而线程池的创建方式也有很多种,每种线程池的创建方式都对应了不同的使用场景。

在这里插入图片描述

总体来说线程池的创建可以分为以下两类

  1. 通过ThreadPoolExecutor手动创建线程池
  2. 通过Executors执行器自动创建线程池

7种实现方法

而以上两类创建线程池的方式,又有7种具体实现方法。这7种实现方法分别是:

  1. Executors.newFixedThreadPool
    创建一个固定大小的线程池,可控制并发的线程数。超出的线程会在队列中等待。
  2. Executors.newCachedThreadPool
    创建一个可缓存的线程池,若线程数超过处理所需。缓存一段时间后会回收,若线程数不够,则新建线程。
  3. Executors.newSingleThreadExecutor
    创建单个线程数的线程池,它可以保证先进先出的执行顺序。
  4. Executors.newScheduledThreadPool
    创建一个可以执行延迟任务的线程池。
  5. Executors.newSingleThreadScheduledExecutor
    创建一个单线程的可以执行延迟任务的线程池。
  6. Executors.newWorkStealingPool
    创建一个抢占式执行的线程池(任务执行顺序不确定)【JDK 1.8添加】
  7. ThreadPoolExecutor
    手动创建线程池的方式,它创建时最多可以设置7个参数。

7种线程池的具体使用

FixedThreadPool

创建一个固定大小的线程池,可控制并发线程数。

CachedThreadPool

创建一个可缓存的线程池,若线程数超过任务所需,那么多余的线程会被缓存一段时间后才被回收,若线程数不够,则会新建线程。

使用场景:CachedThreadPool是根据短时间的任务量来决定创建的线程数量的。所以它适合短时间内有突发大量任务的处理场景。

SingleThreadExecutor

创建单个线程的线程池,它可以保证先进先出的执行顺序。

单个线程的线程池有什么意义?
单个线程的线程池相比线程来说,它的优点有以下2个:

  1. 可以复用线程,即使是单个线程池,也可以复用线程
  2. 提供了任务管理功能。单个线程池也拥有任务队列,在任务队列可以存储多个任务。这是线程无法实现的,并且当任务队列满了之后,可以执行拒绝策略。这些都是线程不具备的。

ScheduledThreadPool

创建一个可以执行延迟任务的线程池

SingleThreadScheduledExecutor

创建一个单线程的可以执行延迟任务的线程池
此线程池可以看作是ScheduledThreadPool的单线程池版本。

newWorkStealingPool

创建一个抢占式执行的线程池(任务执行顺序不确定)。此方法是JDK1.8版本新增的,因此只有在JDK1.8以上的程序中才能使用。

任务的执行顺序是不确定的,因为它是抢占式执行的。

ThreadPoolExecutor

最原始、也是最推荐的手动创建线程池的方式,它在创建时最多提供7个参数可供设置

ThreadPoolExecutor相比于其他创建线程池的优势在于它可以通过参数来控制最大任务数拒绝策略,让线程池的执行更加透明和可控。

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

说明

Executors返回的线程池对象的弊端如下:

  1. FixedThreadPool和SingleThreadPool允许的请求队列长度为Integer.MAX_VALUE。可能会堆积大量的请求,从而导致OOM(内存溢出)。
  2. CachedThreadPool允许的创建线程数量Integer.MAX_VALUE。可能会创建大量的线程,从而导致OOM。

总结

线程池的创建方式总共有以下7种:

  1. Executors.newFixedThreadPool创建一个固定大小的线程池,可控制并发的线程数。超出的线程会在队列中等待。
  2. Executors.newCachedThreadPool创建一个可缓存的线程池,若线程数超过处理所需,缓存一段时间后会回收,若线程数不够,则新建线程。
  3. Executors.newSingleThreadExecutor创建单个线程数的线程池,它可以保证先进先出的执行顺序。
  4. Executors.newScehduledThreadPool创建一个可以执行延迟任务的线程池。
  5. Executors.newSingleThreadScheduledExecutor创建一个单线程的可以执行延迟任务的线程池。
  6. Executors.newWorkStealingPool创建一个抢占式执行的线程池(任务执行顺序不确定)【JDK1.8添加】
  7. ThreadPoolExecutor手动创建线程池的方式,它创建时最多可以设置7个参数,而线程池的创建推荐使用最后一种ThreadPoolExecutor的方式来创建,因为使用它可以明确线程池的运行规则,规避资源耗尽的风险。

参考资料:面试突击28:线程池有几种创建方式?推荐使用哪种?

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【重新定义matlab强大系列三】MATLAB清洗离群数据(查找、填充或删除离群值)

🔗 运行环境:matlab 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 #### 防伪水印——左手の明天 #### 💗 大家好🤗&#x1f91…

异常详解

一、初识异常 异常概念: 所谓异常指的就是程序在 运行时 出现错误时通知调用者的一种机制。 而运行时指的是程序已经编译通过得到 class 文件了, 再由 JVM 执行过程中出现的错误。 1.除以 0 System.out.println(10 / 0); // 执行结果 Exception in thread "…

02 - 学会提问

学会提问 一、引言 1.1 GPT简介 GPT(Generative Pre-trained Transformer)是一种基于Transformer架构的大型预训练语言模型。 凭借其强大的文本生成、理解和处理能力,GPT已在诸如自然语言处理、机器翻译、文本摘要等多个领域取得了显著的…

python+vue 高校资助系统

其中各子模块的主要功能如下: 1、用户登录:用户进入系统先输入用户名与密码,选择权限登录,用户登录成功,要记录登录的用户名和登录类型。 2、学生注册:学生注册填写学号、密码、确认密码、学生姓名、邮箱、…

Python小姿势 - Python操作MongoDB数据库

Python操作MongoDB数据库 MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 现在&a…

Leetcode力扣秋招刷题路-0295

从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结 295. 数据流的中位数 中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。 …

springboot,Flowable 流程实例的激活与挂起(二)

一.简介 接上一篇 springboot&#xff0c;Flowable 流程实例的激活与挂起&#xff08;一&#xff09; 二.流程实例的挂起与激活 1.流程实例的挂起 挂起一个流程实例的代码如下&#xff1a; Test void test08() {List<ProcessDefinition> list repositoryService.cr…

Cycling 74 Max for Mac:音乐可视化编程软件

Cycling 74 Max是一款音乐、视觉、互动艺术等领域中广泛使用的编程语言和应用软件&#xff0c;它允许用户创作和控制实时音频和视频效果、交互式应用程序和媒体艺术品等。 Max将程序设计和可视化编程相结合&#xff0c;通过简单的拖拽和连接方式&#xff0c;用户可以将各种功能…

cuda编码例程(转载借鉴)

内容出处&#xff1a;https://mp.csdn.net/mp_blog/creation/editor 1. 前言 这是一份简单的CUDA编程入门&#xff0c;主要参考英伟达的官方文档进行学习&#xff0c;本人也是刚开始学习&#xff0c;如有表述错误&#xff0c;还请指出。官方文档链接如下&#xff1a; An Eve…

第2章-类加载子系统

1、本系列博客&#xff0c;主要是面向Java8的虚拟机。如有特殊说明&#xff0c;会进行标注。 2、本系列博客主要参考尚硅谷的JVM视频教程&#xff0c;整理不易&#xff0c;所以图片打上了一些水印&#xff0c;还请读者见谅。后续可能会加上一些补充的东西。 3、尚硅谷的有些视频…

vue 实现el-select组件 配合 el-tabs 完成动态tabs然后有勾选 全选,还有模拟提交,回显数据

cv即可使用 <!DOCTYPE html> <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" conten…

Python读取DataFrame的某行或某列

行索引、列索引、loc和iloc import pandas as pd import numpy as np # 准备数据 df pd.DataFrame(np.arange(12).reshape(3,4),indexlist("abc"),columnslist("WXYZ"))行索引(index)&#xff1a;对应最左边那一竖列 列索引(columns)&#xff1a;对应最…

使用手机在网状态查询 API 有效防止虚假注册的设计思路

引言 随着移动互联网的普及&#xff0c;手机在网状态成为重要的数据指标。在网状态反映了手机用户的实际使用情况&#xff0c;对于各类企业和机构具有重要意义。 本文将为大家介绍手机在网状态 API 的主要特点和优势&#xff0c;并且探讨手机在网状态 API 的应用场景和效果展…

【小DS】ABC250 E - Prefix Equality

一开始看题解把我CPU干烧了 后来豁然开朗 E - Prefix Equality (atcoder.jp) 题意&#xff1a; 给定两个数组a,b&#xff0c;每次询问两个位置x和y&#xff0c;问a数组前x个构成的集合和b数组前y个构成的集合是不是一样 思路&#xff1a; 一开始纯暴力RE了 #include <…

IDEA 重磅插件 - Bito – GPT-4

笔者会陆续在个人主页 “AI” 专栏推荐优质 AI 软件、插件、网站… 而不是一股脑地抛给你一堆自行筛选&#xff0c;每一款都是笔者亲自体验感觉还不错的。 如果对你有帮助记得一键三连获取最新优质文章&#xff01; 1.介绍 Bito – GPT-4 Bito – GPT-4 & ChatGPT to writ…

WiFi 时钟

WiFi 时钟有很多开源项目的。但是&#xff0c;成品往往代码一大篇&#xff0c;看起来有些上头。加上有些库和环境的版本变迁&#xff0c;编译报错排查起来很是费劲。于是从头捋一遍&#xff0c;一步一步的过程&#xff0c;容易上手&#xff1a; 准备工作&#xff1a; a 零件&…

Netty源码解读

Netty源码解读 Netty线程模型 1、定义了两组线程池BossGroup和WorkerGroup&#xff0c;BossGroup专门负责接收客户端的连接, WorkerGroup专门负责网络的读写 2、BossGroup和WorkerGroup类型都是NioEventLoopGroup&#xff0c;Group中维护了多个事件循环线程NioEventLoop&#…

AI新产品层出不穷,学不过来怎么办。

最近各个互联网巨头和创业新贵发布的AI工具&#xff0c;AI模型层出不穷&#xff0c;相关自媒体的热度也都很高&#xff0c;当然&#xff0c;各种大佬的隔空喊话也是非常吸引眼球&#xff0c;那么很多人就会觉得&#xff0c;要看的东西太多了&#xff0c;要学的东西太多了&#…

【数据结构】顺序表详解(附leetcode练习题)

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C语言和数据结构 &#x1f33c;博客专栏&#xff1a;数据结构 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4aa;&…

Java编译器插件Manifold(流形)

流形 文天祥正气歌中有云&#xff1a;“天地有正气&#xff0c;杂然赋流形”。 流形是一种抽象而又具体的事务&#xff0c;要研究一个事务就要格物&#xff0c;不格物就不能知道事物的具体描绘形式。流形大多数情况下是一种数学计算方式&#xff0c;可以将一个复杂的模型抽象…