【JavaEE】线程池

【JavaEE】线程池

  • 一、引言
      • 1.1 什么是线程池
      • 1.2 为什么要使用线程池
  • 二、ThreadPoolExecutor类
      • 2.1 构造方法
        • 2.1.1 corePoolSize和maximumPoolSize
        • 2.1.2 KeepAliveTime和unit
        • 2.1.3 BlockingQueue<Runnable> workQueue
        • 2.1.4 ThreadFactory threadFactory
        • 2.1.5 RejectedExecutionHandler handler
      • 2.2 模拟拒绝策略
  • 三、线程池的实例
  • 四、模拟实现线程池

博客结尾有此篇博客的全部代码!!!

一、引言

1.1 什么是线程池

线程池是一种用于管理和复用线程的机制,通过线程池可以有效降低线程创建和销毁的开销,提高系统的响应速度和资源利用率,允许任务等待处理!

1.2 为什么要使用线程池

  1. 线程的创建和销毁相比于进程的创建和销毁是微不足道的,但是大量线程的创建和销毁消耗的资源也是不少的。
  2. 线程的创建是由内核控制的,这个操作是不可控的;而从线程池中取线程用,这个操作是可控的。

操作系统=内核+配套的应用程序。一个操作系统只有一份内核,内核为其他应用程序提供服务。

  • 需要内核配合完成的都是不可控的

Java中的线程池主要通过ThreadPoolExecutor类实现,同时提供了Executors工具类来方便地创建不同类型的线程池。

二、ThreadPoolExecutor类

2.1 构造方法

在这里插入图片描述
这里主要讲解第四个构造方法,参数最多,也是面试中最容易问的!
在这里插入图片描述

2.1.1 corePoolSize和maximumPoolSize

int corePoolSize(核心线程数):线程池中始终保持的线程数量,即使它们处于空闲状态。
int maximumPoolSize(最大线程数):线程池允许的最大线程数。

2.1.2 KeepAliveTime和unit

long KeepAlive(空闲线程存活时间)。举例:当提交的任务过多,corePoolSize核心线程数不够,线程池就会创建一些新线程来帮忙处理任务,当这些任务处理完,新创建的线程就空闲下来,如果KeepAlive这段时间没有新任务提交,那么这些新创建的线程就会被终止(除corepoolSize核心线程)
TimeUnit unit:代表时间单位(枚举)
在这里插入图片描述

2.1.3 BlockingQueue workQueue

BlockingQueue workQueue:表示一个线程安全的队列(用来存储执行的任务),支持在队列为空时阻塞获取操作,以及在队列满时阻塞插入操作。

2.1.4 ThreadFactory threadFactory

ThreadFactory threadFactory:ThreadFactory 是一个接口,用于自定义线程的创建方式。它可以帮助你统一管理线程的名称、优先级、守护线程属性和异常处理。

2.1.5 RejectedExecutionHandler handler

RejectedExecutionHandler handler(拒绝策略):是一个接口,用于处理线程池无法执行任务时的情况。当线程池已满且任务队列也已满时,新提交的任务会被拒绝,Java中有四种默认拒绝策略或者实现RejectedExecutionHandler接口自定义策略。
在这里插入图片描述

  1. ThreadPoolExecutor.AbortPolicy(默认策略):任务被拒绝,会抛出 RejectedExecutionException 异常
  2. ThreadPoolExecutor.CallerRunsPolicy:任务被拒绝,会在调用者的线程中运行任务(举例:假设朋友A的电脑坏了,他让我给他帮忙修电脑。但此时我忙着,他就自己动手修电脑)
  3. ThreadPoolExecutor.DiscardOldestPolicy:任务被拒绝,会丢弃队列中最老的任务,然后尝试将新任务加入队列
  4. ThreadPoolExecutor.DiscardPolicy:任务被拒绝,会直接丢弃任务,不抛出异常
  5. 自定义拒绝策略:
class CustomRejectedExecutionHandler implements RejectedExecutionHandler {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {}
}
  • Runnable r 是被拒绝执行的任务
  • ThreadPoolExecutor executor 是当前的线程池实例。它提供了线程池的运行状态和配置信息

2.2 模拟拒绝策略

   public static void main(String[] args) {//当任务队列满则抛出异常RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();ThreadPoolExecutor poolExecutor=new ThreadPoolExecutor(2,//核心线程数4, // 最大线程数60, // 空闲线程存活时间TimeUnit.SECONDS, // 时间单位new LinkedBlockingQueue<>(2), // 任务队列,容量为 2Executors.defaultThreadFactory(), // 默认线程工厂handler);for (int i = 0; i < 100; i++) {poolExecutor.submit(()->{System.out.println( Thread.currentThread().getName());});}}

执行结果:
在这里插入图片描述

三、线程池的实例

ThreadPoolExecutor类实现线程池:允许开发者根据自己需要设定线程池
Executors 工具类:提供了一系列静态方法,用于快速创建不同类型的线程池

图片演示的就是Executors工具类创建线程池!
在这里插入图片描述

  public static void main(String[] args) {ExecutorService threadPool = Executors.newFixedThreadPool(2);for (int i = 0; i < 10; i++) {int id = i;threadPool.submit(() -> {System.out.println("hello " + id + ", " + Thread.currentThread().getName());});}}

执行结果:
在这里插入图片描述

四、模拟实现线程池

class MyThreadPoolExecutor {//先创建一个阻塞队列用来存储任务BlockingQueue<Runnable> queue= new LinkedBlockingQueue<Runnable>();//创建一个sumbit方法用来提交Runnablepublic void sumbit(Runnable runnable) throws InterruptedException {queue.put(runnable);}//定义一个构造方法来创建线程池中的线程数public MyThreadPoolExecutor(int n){for (int i = 0; i < n; i++) {Thread thread = new Thread(()->{try {while(true){Runnable task=queue.take();//从队列中取出任务task.run();//执行任务}} catch (InterruptedException e) {throw new RuntimeException(e);}});thread.start();}}
}public class Demo5 {public static void main(String[] args) throws InterruptedException {MyThreadPoolExecutor executor = new MyThreadPoolExecutor(5);for (int i = 0; i < 5; i++) {executor.sumbit(()->{System.out.println(Thread.currentThread().getName());});}}
}

此篇博客的全部的代码!!!

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

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

相关文章

GaussDB安全配置指南:从认证到防御的全方面防护

一、引言 随着企业数据规模的扩大和云端化进程加速&#xff0c;数据库安全性成为运维的核心挑战之一。GaussDB作为一款高性能分布式数据库&#xff0c;提供了丰富的安全功能。本文将从 ​认证机制、权限控制、数据加密、审计日志​ 等维度&#xff0c;系统性地讲解如何加固 Ga…

Ubuntu 22.04 升级到 Ubuntu 24.04 全流程指南

&#x1f4cc; 1. 前言 Ubuntu 24.04 是最新的 LTS 版本&#xff0c;带来了内核更新、性能优化以及更强的安全性。本指南详细记录了从 Ubuntu 22.04 升级到 24.04 的完整过程&#xff0c;包括 升级前的准备、遇到的问题及如何选择最佳选项&#xff0c;避免升级失败或系统损坏。…

Git和GitHub基础教学

文章目录 1. 前言2. 历史3. 下载安装Git3.1 下载Git3.2 安装Git3.3 验证安装是否成功 4. 配置Git5. Git基础使用5.1 通过Git Bash使用5.1.1 创建一个新的仓库。5.1.1.1 克隆别人的仓库5.1.1.2 自己创建一个本地仓库 5.1.2 管理存档 5.2 通过Visual Studio Code使用 6. Git完成远…

【leetcode hot 100 234】回文链表

错误解法一&#xff1a;正序查找的过程中&#xff0c;将前面的元素倒叙插入inverse链中&#xff0c;找到偶数中点时&#xff0c;对称查找。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* Li…

Manus:成为AI Agent领域的标杆

一、引言 官网&#xff1a;Manus 随着人工智能技术的飞速发展&#xff0c;AI Agent&#xff08;智能体&#xff09;作为人工智能领域的重要分支&#xff0c;正逐渐从概念走向现实&#xff0c;并在各行各业展现出巨大的应用潜力。在众多AI Agent产品中&#xff0c;Manus以其独…

IDEA(十一)调整新版本的工具栏显示Git操作(pull、commit、push、revert等)

目录 一、背景二、操作步骤2.1 开启新 UI 样式2.2 设置 Tool Window 工具栏 一、背景 好久没有更新 IDEA 了&#xff0c;更新之后发现 IDEA 的工具栏消失了。一番操作之后&#xff0c;终于把 IDEA 的工具栏的设置调整好了&#xff0c;在此进行记录调整步骤&#xff0c;供大家学…

Mysql快速学习——《一》: Mysql的基础架构

了解mysql的基础架构, 理解大概的实现思想, 更有利与我们知之所以然, 是我们学习mysql起来思路更清晰, 效率更高. 思维导图: mysql 基础架构 mysql基础架构.png 1. 连接器 Mysql作为服务器&#xff0c;一个客户端的Sql连接过来就需要分配一个线程进行处理&#xff0c;这个线程…

[Pytorch报错问题解决]AttributeError: ‘nn.Sequential‘ object has no attribute ‘append‘

问题 运行深度学习代码的时候遇到了以下报错问题&#xff1a; Traceback (most recent call last):File "/home/anaconda3/envs/Text2HOI/lib/python3.9/site-packages/torch/autograd/grad_mode.py", line 28, in decorate_contextreturn func(*args, **kwargs)Fi…

小支从学习到认证:NebulaGraph 图数据库认证之旅

前言 在数据爆炸的当下&#xff0c;图数据库凭借其独特的优势&#xff0c;成为处理复杂数据关系的有力工具。NebulaGraph 作为图数据库领域的佼佼者&#xff0c;以高性能、可扩展性和易用性赢得了广泛认可。对于想要在这一领域深入发展的专业人士来说&#xff0c;从学习到获得 …

windows:curl: (60) schannel: SEC_E_UNTRUSTED_ROOT (0x80090325)

目录 1. git update-git-for-windows 报错2. 解决方案2.1. 更新 CA 证书库2.2. 使用 SSH 连接&#xff08;推荐&#xff09;2.3 禁用 SSL 验证&#xff08;不推荐&#xff09;2.4 使用pull不使用update 1. git update-git-for-windows 报错 LenovoLAPTOP-EQKBL89E MINGW64 /d/…

mac使用Homebrew安装miniconda(mac搭建python环境),并在IDEA中集成miniconda环境

一、安装Homebrew mac安装brew 二、使用Homebrew安装miniconda brew search condabrew install miniconda安装完成后的截图&#xff1a; # 查看是否安装成功 brew list环境变量&#xff08;无需手动配置&#xff09; 先执行命令看能不能正常返回&#xff0c;如果不能正常…

2025人工智能AI新突破:PINN内嵌物理神经网络火了

最近在淘金的时候发现基于物理信息的神经网络&#xff08;简称PINN&#xff09;也是个研究热点&#xff0c;遂研读了几篇经典论文&#xff0c;深觉这也是个好发论文的方向&#xff0c;所以火速整理了一些个人认为很值得一读的PINN论文和同学们分享。 为了方面同学们更好地理解…

Android MVC、MVP、MVVM三种架构的介绍和使用。

写在前面&#xff1a;现在随便出去面试Android APP相关的工作&#xff0c;面试官基本上都会提问APP架构相关的问题&#xff0c;用Java、kotlin写APP的话&#xff0c;其实就三种架构MVC、MVP、MVVM&#xff0c;MVC和MVP高度相似&#xff0c;区别不大&#xff0c;MVVM则不同&…

大空间多人互动技术、大空间LBE、VR大空间什么意思?如何实现?

什么是VR? 虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;是一种通过计算机技术模拟生成的三维虚拟环境&#xff0c;用户可以通过佩戴VR头显等设备&#xff0c;沉浸在这个虚拟世界中&#xff0c;并与其中的物体、场景进行互动。VR技术的核心在于提供身临…

3D匹配算法简述

一.什么是3D匹配 •形状、大小一致的源点云与目标点云之间的刚体变换。 •源点云通过平移与旋转操作变换到目标点云位置使之重合。 •源点云与目标点云坐标系之间的变换。 典型的应用流程为&#xff1a; 3D相机数据采集----点云生成----点云处理----目标点云提取----3D模板…

【今日EDA行业分析】2025年3月8日

今日行业分析&#xff1a;半导体行业技术博弈与国产 EDA 的突破与挑战 一、引言 在半导体行业的复杂生态系统中&#xff0c;EDA&#xff08;电子设计自动化&#xff09;技术处于核心地位&#xff0c;是连接芯片设计、制造与应用的关键纽带。当下&#xff0c;全球半导体领域正经…

NAT NAPT

NAT NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09; 主要用于在不同网络&#xff08;如私有网络和公共互联网&#xff09;之间进行 IP 地址转换&#xff0c;解决IP 地址短缺问题&#xff0c;并提供一定的安全性。 IPv4 地址是 32 位&#xf…

固定表头、首列 —— uniapp、vue 项目

项目实地&#xff1a;也可以在 【微信小程序】搜索体验&#xff1a;xny.handbook 另一个体验项目&#xff1a;官网 一、效果展示 二、代码展示 &#xff08;1&#xff09;html 部分 <view class"table"><view class"tr"><view class&quo…

微服务——网关、网关登录校验、OpenFeign传递共享信息、Nacos共享配置以及热更新、动态路由

之前学习了Nacos&#xff0c;用于发现并注册、管理项目里所有的微服务&#xff0c;而OpenFeign简化微服务之间的通信&#xff0c;而为了使得前端可以使用微服务项目里的每一个微服务的接口&#xff0c;就应该将所有微服务的接口管理起来方便前端调用&#xff0c;所以有了网关。…

[免费]微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端+Vue管理端)(高级版)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端Vue管理端)(高级版)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端Vue管理端)(高级版…