JUC并发编程_线程池

JUC并发编程_线程池

    • 一、线程池的介绍
    • 二、线程池的创建方式
      • 1、通过 Executors 工厂类创建
      • 2、通过ThreadPoolExecutor构造函数创建
    • 三、线程池的工作流程
    • 四、线程池的四种拒绝策略
    • 五、最大线程数如何设置
    • 六、注意事项

一、线程池的介绍

线程池的组成:
Java中的线程池主要由 java.util.concurrent 包下的Executor、ExecutorService、ThreadPoolExecutor等接口和类提供支持。其中,ThreadPoolExecutor是线程池的核心实现类。

Executor:线程池的顶级接口,定义了execute(Runnable command)方法,用于提交任务。
ExecutorService:Executor的子接口,增加了管理线程池生命周期和任务执行的方法,如submit(Callable/Void)、shutdown()、shutdownNow()等。
ThreadPoolExecutor:ExecutorService 的默认实现,提供了丰富的配置选项,如核心线程数、最大线程数、工作队列类型、线程存活时间等。

线程池的好处:
1、降低资源消耗(线程复用)
2、提高响应速度
3、方便管理(控制最大并发数)

二、线程池的创建方式

1、通过 Executors 工厂类创建

不推荐使用 Executors 创建线程池,它们的阻塞队列长度都是 Integer.MAX_VALUE,可能会堆积大量请求,从而导致 OOM

newFixedThreadPool(int nThreads):创建一个固定大小的线程池,适用于控制最大并发数的场景

//实例化一个固定大小为10个线程的newFixedThreadPool线程池
ExecutorService threadPool = Executors.newFixedThreadPool(10);try {for (int i = 0; i < 10; i++) {threadPool.execute(() -> {System.out.println(Thread.currentThread().getName() + " ok");});}
} catch (Exception e) {e.printStackTrace();
} finally {//关闭线程池threadPool.shutdown();
}

newSingleThreadExecutor():创建一个单线程的线程池,保证所有任务按照指定顺序执行。
newCachedThreadPool():创建一个可缓存的线程池,适用于执行大量短期异步任务的场景。
newScheduledThreadPool(int corePoolSize):创建一个定时线程池,用于定时及周期性任务执行。

2、通过ThreadPoolExecutor构造函数创建

使用 ThreadPoolExecutor 的构造函数可以更加灵活地配置线程池,如指定核心线程数、最大线程数、线程存活时间、工作队列等参数。

public ThreadPoolExecutor(int corePoolSize, //核心线程数int maximumPoolSize, //最大线程数long keepAliveTime, // 非核心线程最大空闲时间TimeUnit unit, // 最大空闲时间单位BlockingQueue<Runnable> workQueue, //阻塞队列ThreadFactory threadFactory, //线程工厂RejectedExecutionHandler handler //拒绝策略) {
}
// 创建一个容量为10的阻塞队列
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(10);// 创建ThreadPoolExecutor(核心线程数为10,最大线程数为15,非核心线程最大空闲时间为30s,阻塞队列容量为10,默认线程工厂,默认拒绝策略)
ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 15, 30, TimeUnit.SECONDS,workQueue);

三、线程池的工作流程

当有新任务提交时,线程池会检查是否有空闲的线程。
如果有空闲线程,则直接将任务分配给该线程执行。
如果没有空闲线程,则检查当前线程数是否达到了核心线程数。
如果未达到核心线程数,则创建新的线程来执行任务。
如果已达到核心线程数,则将任务加入到任务队列中等待执行。
如果任务队列已满,且当前线程数小于最大线程数,则创建新的线程来处理任务。
如果当前线程数等于最大线程数,且任务队列已满,则根据拒绝策略处理无法执行的任务。

四、线程池的四种拒绝策略

当任务队列已满,且无法创建新的线程来执行任务时,线程池会根据配置的拒绝策略来处理这些任务。常见的拒绝策略包括:

AbortPolicy:抛出 RejectedExecutionException 异常,默认策略。
CallerRunsPolicy:由调用线程直接执行任务。
DiscardPolicy:丢弃任务,不抛出异常。
DiscardOldestPolicy:丢弃队列中等待最久的任务,然后执行当前任务。

// 创建一个容量为10的阻塞队列
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(10);
// 创建ThreadPoolExecutor,并指定 DiscardOldestPolicy 作为拒绝策略
ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 15, 30,TimeUnit.SECONDS,workQueue,// 使用默认的线程工厂(这里不显式传递ThreadFactory)new ThreadPoolExecutor.DiscardOldestPolicy() // 指定DiscardOldestPolicy作为拒绝策略
);

五、最大线程数如何设置

//获取本机的逻辑处理器数量
int availableProcessors = Runtime.getRuntime().availableProcessors();

针对CPU密集型的任务,一般将线程池的最大线程数设置的少一点
针对IO密集型的任务,一般将最大线程数设置的多一点

六、注意事项

  • 合理配置线程池的参数,如核心线程数、最大线程数、线程存活时间等,以适应不同的应用场景。
  • 使用有界队列,防止任务队列过长导致内存溢出。
  • 根据具体应用场景选择合适的拒绝策略。
  • 使用完线程池后,应调用shutdown()或shutdownNow()方法来释放资源。

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

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

相关文章

基于C语言开发(控制台)通讯录管理程序

通讯录程序设计 一、课程设计题目与要求 题目 &#xff1a;通讯录管理程序 1. 问题描述 编写一个简单的通讯录管理程序。通讯录记录有姓名&#xff0c;地址(省、市(县)、街道)&#xff0c;电话号码&#xff0c;邮政编码等四项。2. 基本要求 程序应提供的基本基本管理功能有…

豆包 MarsCode 代码练习体验

我最近体验了豆包MarsCode的代码练习&#xff0c;感觉非常棒&#xff01;首先&#xff0c;进入平台后&#xff0c;界面简洁明了&#xff0c;使用起来非常方便。选择内置题目时&#xff0c;题目类型丰富多样&#xff0c;涵盖了基础知识和一些进阶挑战&#xff0c;非常适合不同水…

【Kubernetes知识点】解读HPA的 thrashing(抖动)问题

【Kubernetes知识点】解读HPA的 thrashing&#xff08;抖动&#xff09;问题 目录 1 概念 1.1 什么是 Thrashing 现象&#xff1f;1.2 HPA 中 Thrashing 产生的原因1.3 解决 Thrashing 的优化措施 1.3.1 设置合适的阈值1.3.2 使用自定义指标和基于负载的自动扩缩1.3.3 增加扩…

探寻大模型时代智慧农业新未来,商汤与上海市农委达成战略合作

近日&#xff0c;在中国农民丰收节上海会场丰收庆典活动上&#xff0c;商汤科技与上海市农业农村委员会&#xff08;下称&#xff1a;上海市农委&#xff09;签署战略合作协议&#xff0c;双方将依托先进的AI大模型技术&#xff0c;共同推进上海智慧农业发展&#xff0c;打造国…

基向量和投影矩阵

文章目录 1. 投影向量2. 基向量&#xff0c;列向量秩1分解3. SVD&#xff0c;奇异向量秩1分解4. 小结&#xff1a;5. 图解分析 1. 投影向量 假设我们有一个向量b和一个向量q,求向量b在向量q上的投影向量p: 求向量p的长度&#xff1a; q T b ∣ q ∣ ⋅ ∣ b ∣ ⋅ cos ⁡ …

UNet 眼底血管分割实战教程

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 在医学影像分析领域&#xff0c;准确地分割眼底血管对于眼科疾病的诊断和治疗至关重要。…

[产品管理-33]:实验室技术与商业化产品的距离,实验室技术在商业化过程中要越过多少道“坎”?

目录 一、实验室技术 1.1 实验室研究性技术 1.2 技术发展的S曲线 技术发展S曲线的主要阶段和特点 技术发展S曲线的意义和应用 二、实验室技术商业化的路径 2.1 实验室技术与商业化产品的距离 1、技术成熟度与稳定性 - 技术自身 2、市场需求与适应性 - 技术是满足需求 …

关于yolov5训练需要更改的参数汇总

首先我给大家展示一下项目目录 第一步我们需要修改data文件夹下的voc.yaml文件&#xff0c;这里我复制了一份改名为hat.yaml 需要修改第21&#xff0c;22行的路径&#xff0c;train是图片的训练集&#xff0c;val是图片训练的验证集&#xff0c;nc是标签的数量&#xff0c;name…

解决银河麒麟桌面操作系统V10SP1 SSH连接“connection reset by ip地址 port 22”问题

解决银河麒麟桌面操作系统V10SP1 SSH连接“connection reset by ip地址 port 22”问题 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 遇到SSH连接银河麒麟V10SP1时“connection reset by ip地址 port 22”的错误&#xff0c;可以尝试以下步…

深入浅出热门AI大模型,新手到专家的必备指南《实战AI大模型》

今天&#xff0c;人工智能技术的快速发展和广泛应用已经引起了大众的关注和兴趣&#xff0c;它不仅成为技术发展的核心驱动力&#xff0c;更是推动着社会生活的全方位变革。特别是作为AI重要分支的深度学习&#xff0c;通过不断刷新的表现力已引领并定义了一场科技革命。大型深…

矿区车辆4G视频监控解决方案

一、背景介绍 随着科技的发展和矿山产业的不断进步&#xff0c;矿区的安全问题越来越受到关注。尤其是矿区车辆的运行安全&#xff0c;更是重中之重。为了更好地对矿区车辆进行监控和管理&#xff0c;提高运行安全性&#xff0c;4G视频监控解决方案应运而生。 二、需求分析 1…

Nmap网络扫描器基础功能介绍

怎么快速知道网络中存在哪些设备呢&#xff1f;我们可以借用扫描工具Nmap来实现这个功能。 下载 Windows系统可以前往Nmap官网下载安装包。 Linux使用对应的包管理器可以直接安装&#xff0c;命令如下 # Debian/Ubuntu apt install nmap# RedHat/Fedora yum install nmap …

全西安前十的数字媒体产业链都在这

在古城西安&#xff0c;有一处汇聚着创新与活力的地方&#xff0c;那便是西安国际数字影像产业园。这里&#xff0c;承载着西安数字媒体产业的未来与希望&#xff0c;成为了数字媒体产业链的闪耀聚集地。 西安国际数字影像产业园以其独特的魅力和优势&#xff0c;吸引了众多数字…

Go语言基础学习01-Liunx下Go开发环境配置;源码组织方式;go build/install/get详解

目录 Linux环境下配置安装VScode并配置Go语言开发环境Go语言源码的组织方式Go语言源码安装后的结果Go程序构建和安装的过程go build扩展go get 命令详解 之前学习过Go语言&#xff0c;学习的时候没有记录笔记&#xff0c;最近找了个极客时间的Go语言36讲&#xff0c;打算时间学…

004_动手实现MLP(pytorch)

import torch from torch import nn from torch.nn import init import numpy as np import sys import d2lzh_pytorch as d2l # 1.数据预处理 mnist_train torchvision.datasets.FashionMNIST(root/Users/w/PycharmProjects/DeepLearning_with_LiMu/datasets/FashionMnist, t…

二刷LeetCode:“51.N皇后 37.解数独”题解心得(简单易懂)

引言&#xff08;初遇噩梦&#xff0c;再遇坦然&#xff09; 在阅读本文之前&#xff0c;建议大家已经接触过回溯算法&#xff0c;并完成回溯相关题目&#xff0c;例如&#xff1a;子集问题、组合问题、排列问题。 子集&#xff1a;子集II、子集 组合&#xff1a;组合、组合总和…

多比特AI事业部VP程伟光受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 武汉市多比特信息科技有限公司AI事业部VP程伟光先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“AI对于项目经理工作的影响和变化解析”。大会将于10月26-27日在北京举办&am…

Scanner流程控制语句

1. Scanner类 Scanner的意思是扫描 Scanner是JDK提供的一个类&#xff0c;位于java.util包下&#xff0c;所以我们如果需要使用则必须导包&#xff0c;导包的语句必须在声明包之后&#xff0c;在声明类之前 Scanner类是用来接受用户输入的各种信息 Scanner类提供了用于接受…

SpringBoot开发——整合Hutool工具类轻松生成验证码

文章目录 1、Hutool简介2、验证码效果展示2.1 扭曲干扰验证码2.2 线条干扰验证码2.3 圆圈干扰验证码3、验证码应用场景3.1. 用户注册与身份验证3.2. 支付验证3.3. 订单与物流通知3.4. 信息安全与隐私保护3.5. 通知与提醒3.6. 其他应用场景4、Hutool工具类实现验证码生成4.1 引入…

学习threejs,绘制任意字体模型

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言二、&#x1f340;绘制任意字体模型…