线程池的种类有哪些

news2026/5/4 15:47:07

在Java中,线程池主要通过java.util.concurrent.ExecutorService接口进行管理,该接口有几个内置的实现和相关的工具类,主要是在java.util.concurrent.Executors类中。以下是几种常见的线程池以及它们的用例、特点和源码分析。

1. FixedThreadPool

固定数量线程的线程池。当所有线程都活跃时,新任务会在队列中等待。

特点
  • 核心线程数和最大线程数相同。
  • 无界队列(LinkedBlockingQueue)。
  • 因为队列无界,所以最大线程数的设置实际上没有作用。
示例
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);

2. CachedThreadPool

一个可根据需要创建新线程的线程池,但会在以前构建的线程可用时重用它们。线程空闲60秒后将被回收。

特点
  • 核心线程数为0。
  • 最大线程数为Integer.MAX_VALUE
  • 有界队列(SynchronousQueue)。
  • 适合短暂异步任务。
示例
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

3. SingleThreadExecutor

单个后台线程的线程池。

特点
  • 核心线程数为1且最大线程数也为1。
  • 无界队列(LinkedBlockingQueue)。
  • 所有任务都保证按照任务提交顺序执行。
示例
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

4. ScheduledThreadPool

一个可以延时启动或定期执行任务的线程池。

特点
  • 核心线程数固定,最大线程数无界。
  • 使用延迟队列(DelayedWorkQueue)管理延时任务。
示例
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(10);

5. WorkStealingPool (Java 8+)

使用多个队列减少竞争。每个线程都有自己的队列,但是可以窃取其他线程的任务。

特点
  • 核心线程数和最大线程数通常设置为可用CPU核心数。
  • 使用ForkJoinPool实现。
示例
ExecutorService workStealingPool = Executors.newWorkStealingPool();

现在让我们更深入地研究一下ThreadPoolExecutor的构造函数,这是上述线程池种类背后的核心实现。

ThreadPoolExecutor源码解析

以下是ThreadPoolExecutor类的部分源码及注释,说明了如何创建一个线程池,并描述了不同参数的含义。

public class ThreadPoolExecutor extends AbstractExecutorService {
    /**
     * @param corePoolSize 核心线程数
     * @param maximumPoolSize 最大线程数
     * @param keepAliveTime 当线程数量超过核心线程数时,这是多余空闲线程在终止前等待新任务的最大时间。
     * @param unit keepAliveTime的时间单位
     * @param workQueue 用来储存等待执行任务的队列
     * @param threadFactory 创建新线程的工厂
     * @param handler 当线程池和队列满了,决定如何拒绝新任务的拒绝策略
     */
    public ThreadPoolExecutor(
        int corePoolSize,
        int maximumPoolSize,
        long keepAliveTime,
        TimeUnit unit,
        BlockingQueue<Runnable> workQueue,
        ThreadFactory threadFactory,
        RejectedExecutionHandler handler) {
        // ... 构造函数实现
    }
    // ... 其他方法和实现
}

示例:自定义ThreadPoolExecutor

以下是创建自定义线程池的示例,设置了核心线程数、最大线程数、存活时间、工作队列等参数。

int corePoolSize = 5;
int maxPoolSize = 10;
long keepAliveTime = 120;
TimeUnit timeUnit = TimeUnit.SECONDS;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(50);

ThreadFactory threadFactory = Executors.defaultThreadFactory();
RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.CallerRunsPolicy();

ThreadPoolExecutor customPoolExecutor = new ThreadPoolExecutor(
    corePoolSize,
    maxPoolSize,
    keepAliveTime,
    timeUnit,
    workQueue,
    threadFactory,
    rejectedExecutionHandler
);

在这个自定义线程池中,我们指定了核心线程数和最大线程数,还有一个有界工作队列。如果线程池忙碌且队列满了,那么CallerRunsPolicy拒绝策略将会使提交任务的线程自己执行该任务。

总的来说,线程池的选择和配置都取决于具体应用的需求,要注意合理地利用系统资源,避免过多的线程导致的上下文切换开销,以及线程池和队列大小设置不当造成的资源耗尽风险。

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

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

相关文章

差分逻辑电平 --- LVDS、CML、LVPECL互连

前言 首先了解差分逻辑电平结构&#xff0c;也包括单端逻辑电平 地址&#xff1a;常见的逻辑电平_常用的逻辑电平-CSDN博客 注&#xff1a;ECL >> PECL >> LVPECL演变而来&#xff1b;QDR&#xff08;Quad Data Rate):四倍数据倍率 本文章只涉及差分逻辑电平:LVDS…

[CISCN2019 华北赛区 Day2 Web1]Hack World 不会编程的崽

sql注入之简单的盲注。 为什么很多题目总是怪怪的&#xff1f;&#xff1f;&#xff1f; 输入1返回正常&#xff0c;但是1 and 11显示异常。fuzz大法启动 这些东西被禁用了。实际上"(and)"也被禁用了&#xff0c;看来fuzz字典还是少了很多。 刚好它告诉你表名与列名…

【Java】萌新的Spring纯注解集成Dubbo学习笔记

目录 介绍 Dubbo架构 实现 介绍 Dubbo 是一款高性能的 Java RPC 框架&#xff0c;它提供了完整的服务治理解决方案&#xff0c;包括远程服务调用、负载均衡、容错机制、服务注册和发现等功能。同时&#xff0c;Dubbo 与 Zookeeper 进行集成&#xff0c;利用 Zookeeper 作为…

爬虫之矛---JavaScript基石篇5<JS混淆问题(2)>

前言: 继续上一篇:https://blog.csdn.net/m0_56758840/article/details/136633897 正文: 在这一篇讲混淆的时候,需要先清除一个概念!! 什么是Unicode~ Unicode编码 定义 Unicode是一种字符编码标准&#xff0c;用于表示世界上几乎所有的字符集。它为每个字符分配了一个唯一…

手机备忘录可以设置密码吗 能锁屏加密的备忘录

在繁忙的生活中&#xff0c;手机备忘录成了我随身携带的“小秘书”。那些关于工作的灵感、生活的琐事&#xff0c;甚至深藏心底的小秘密&#xff0c;都被我一一记录在里面。然而&#xff0c;每次当手机离开我的视线&#xff0c;或者需要借给他人使用时&#xff0c;我总会心生担…

使用Anaconda创建Python指定版本的虚拟环境

由于工作的需要和学习的需要&#xff0c;需要创建不同Python版本的虚拟环境。 比如zdppy的框架&#xff0c;主要支持的是Python3.8的版本&#xff0c;但是工作中FastAPI主要使用的是3.11的版本&#xff0c;所以本地需要两套Python环境。 决定使用Anaconda虚拟环境管理的能力&…

【Web世界探险家】打开Web世界的大门

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &…

2024 年 2 月 NFT 行业动态:加密货币飙升,NFT 市场调整

作者&#xff1a;stellafootprint.network 数据来源&#xff1a;NFT 研究页面 - Footprint Analytics 2024 年 2 月&#xff0c;加密货币与 NFT 市场显现出了复杂性。该月&#xff0c;NFT 领域的交易量达到 12 亿美元&#xff0c;环比下降了 3.7%。值得关注的是&#xff0c;包…

鸿蒙原生应用元服务开发-WebGL网页图形库开发无着色器绘制2D图形

无着色器绘制2D图形 使用WebGL开发时&#xff0c;为保证界面图形显示效果&#xff0c;请使用真机运行。 此场景为未使用WebGL绘制的2D图形&#xff08;CPU绘制非GPU绘制&#xff09;。开发示例如下&#xff1a; 1.创建页面布局。index.hml示例如下&#xff1a; <div class…

【Spring】学习Spring框架那点小事儿

Spring作者&#xff1a;Rod Johnson Rod Johnson 是一位软件开发人员和作家&#xff0c;他在软件开发领域有着广泛的影响力。他出生于澳大利亚&#xff0c;拥有计算机科学和音乐双学位&#xff08;能写出有优雅的代码一定有艺术细胞&#xff09;。 Rod Johnson 在 2002 年出版…

【Vuforia+Unity】一个简单AR识别图像弹出按钮播放暂停视频

场景搭建 2.按钮播放视频这部分写一个按钮回调函数即可 3.控制视频的代码 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Video;public class videomanager : MonoBehaviour {// 这个脚本实现按钮控制VIDEO播放GameO…

机试:最大子序列的和

问题描述: 算法思想: 若第(i-1)个序列的小于0,则第i个序列的最大值为nums[i]; 若第(i-1)个序列的小于0,则第i个序列的最大值为max(i-1) nums[i]; 如果max(i-1)>0,max(i)max(i-1)Nums(i) 如果max(i-1)<0,max(i)Nums(i)代码示例: #include <bits/stdc.h> //该算法…

Scrapy 爬虫框架

网络爬虫框架scrapy &#xff08;配置型爬虫&#xff09; 什么是爬虫框架&#xff1f; 爬虫框架是实现爬虫功能的一个软件结构和功能组件集合爬虫框架是个半成品&#xff0c;帮助用户实现专业网络爬虫 scrapy框架结构("52"结构) spider: 解析downloader返回的响…

unity3d Animal Controller的动物组件使用明天继续

控制器介绍 动物脚本负责控制动物的所有运动逻辑.它管理所有的动画师和刚体参数,以及所有的状态和模式,动物可以做。 动物控制器 是一个动画框架控制器,根动或到位,为任何生物或人形。它利用刚体与物理世界的互动和动画师的玩动画。 States States 是不互相重叠的动画。例如…

算法刷题Day7 | 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和

目录 0 引言1 四数相加II1.1 使用map解题1.2 总结 2 赎金信2.1 我的解题 3 三数之和3.1 双指针法 4 四数之和4.1 双指针题解 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1f4a5; 标题&#xff1a;算法刷题Day7 | 454.四数相加II…

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 4-4、线条平滑曲面(修改颜色)去除无效点

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fro…

redis 中的八大问题

前言 在分布式系统中&#xff0c;由于redis分布式锁相对于更简单和高效&#xff0c;成为了分布式锁的首先&#xff0c;被我们用到了很多实际业务场景当中。 但不是说用了redis分布式锁&#xff0c;就可以高枕无忧了&#xff0c;如果没有用好或者用对&#xff0c;也会引来一些意…

查找和最小的 K 对数字

优质博文IT-BLOG-CN 一、题目 给定两个以 非递减顺序排列 的整数数组nums1和nums2, 以及一个整数k。 定义一对值(u,v)&#xff0c;其中第一个元素来自nums1&#xff0c;第二个元素来自nums2。 请找到和最小的k个数对(u1,v1), (u2,v2) ... (uk,vk)。 示例 1: 输入: nums1 […

PTA L2-007 家庭房产

给定每个人的家庭成员和其自己名下的房产&#xff0c;请你统计出每个家庭的人口数、人均房产面积及房产套数。 输入格式&#xff1a; 输入第一行给出一个正整数N&#xff08;≤1000&#xff09;&#xff0c;随后N行&#xff0c;每行按下列格式给出一个人的房产&#xff1a; …

k8s中calico网络组件部署时一个节点一直处于Pending状态

k8s中calico网络组件部署时一个节点一直处于Pending状态 故障截图 故障排查思路&#xff0c;通过describe查看具体原因 ~]# kubectl describe pod calico-node-pzlfv -n kube-system通过describe查看得知报错 Warning FailedScheduling 58s (x23 over 23m) default-sche…