【JavaEE】【多线程】线程池

目录

  • 一、线程池
  • 二、ThreadPoolExecutor类讲解
    • 2.1 构造方法
      • 2.1.1 corePoolSize和maximumPoolSize
      • 2.1.2 KeepAliveTime和unit
      • 2.1.3 workeQueue
      • 2.1.4 threadFactory
      • 2.1.5 handler
  • 三、简易构造线程池
  • 四、自己实现一个简单线程池

一、线程池

线程池:线程池可以简单理解为存放多个线程的一段空间。

线程池的作用:就是把线程提前创建好,放入线程池中,需要线程时从线程池中取,线程用完归还到线程池中。这样就可以减少线程创建的开销。

一个操作系统包含内核和以及其它计算机系统所必须的组件,
而内核中包含了操作系统的各种核心功能:管理硬件设备,给软件提供稳定的运行环境。
而在计算机中认为有一段代码在应用程序中完成,执行过程是可控的,而在内核中完成的过程是不可控的。而可控的操作比不可控更加高效。

直接创建线程比从线程池拿线程开销小的原因:

  • 直接创建线程,需要内核配合完成,是不可控的;
  • 先创建好在从线程池中去取,取线程就是可控的操作。

Java标准库中提供的类ThreadPoolExecutor就是创建线程池的类。

二、ThreadPoolExecutor类讲解

2.1 构造方法

在ThreadPoolExecutor类中主要提供了下面四种不同参数的构造方法。
我们讲解第四种7种参数版本中每个参数代表什么。

2.1.1 corePoolSize和maximumPoolSize

int corePoolSize代表核心线程数的个数。核心线程随着线程池的创建而创建,销毁而销毁。
int maximumPoolSize代表最大线程数。就是核心线程数与非核心线程数之和。非核心线程是自适应创建的,不繁忙的时候就销毁,繁忙的时候在创建。

2.1.2 KeepAliveTime和unit

long KeepAliveTime代表非核心线程允许空闲的最大时间。
TimeUnit unit代表时间单位。
TimeUnit是一个枚举类。

2.1.3 workeQueue

blockingQueue<Runnable> workQueue代表工作队列,也是一个阻塞队列。线程池本身就是一个生产者消费者模型,调用submit方法就是在生产,线程池中的线程就是消费者。

2.1.4 threadFactory

ThreadFactory threadFactory给线程Thread类提供的工厂类。
ThreadFactory是一个接口。

并不能直接出来一个对象,需要我们自己创建类实现该接口。
也可以使用Java中自带的默认的方式Executors类下的defaultThreadFactory方法:Executors.defaultThreadFactory();

工厂模式:工厂模式就是主要用来弥补构造方法的缺陷的一种设计模式。当构造方法因为重载限制时,可以当前类中使用static静态方法(这个静态方法也称为工厂方法)或者单独使用一个类提供静态方法(这个类称为工厂类),在静态方法中调用构造方法。

例子:我们表示一个点的坐标有使用(x,y)坐标系的方法和(ρ,θ)来表示。
像下面这样提供构造方法就会报错。

但是我们像下面这样提供一个工厂类就可以避免了。

class Point {
    double x;
    double y;
    double ρ;
    double θ;
}
class PointFactory {
    public static void PointXY(double x, double y) {
        Point point = new Point();
        point.x = x;
        point.y = y;
        
    }
    public static void Pointρθ(double ρ, double θ) {
        Point point = new Point();
        point.ρ = ρ;
        point.θ = θ;

    }
    
}

2.1.5 handler

RejectedExectionHandler handler表示 拒绝策略。

在调用submit,将任务给到任务队列,而在线程池中不会像阻塞队列一样,队列满了就阻塞,而是提供了4中拒绝策略。

  • AbortPolicy:线程池中直接抛出异常,撂挑子不干了。
  • CallerRunsPolicy:让调用submit方法的线程自己执行这个任务。
  • DiscardOldestPolicy:丢弃线程池中最老的任务,给新任务腾出空间。
  • DiscardPolicy:丢弃线程池中最新的任务,即submit的任务。

三、简易构造线程池

在Java中提供了Exectors类对ThreadPoolExecutor类进行了进一步封装,可以使用这个类来创建一个默认的线程池。

四、自己实现一个简单线程池

我们创建一个固定容量的线程池,只实现其中的submit方法和构造方法。

  • 构造一个阻塞队列;
  • 在构造方法中传要创建的线程数,循环创建线程,在线程中循环拿出队列中的任务,并执行run方法,不要忘记start线程。
  • 在submit方法中只要将任务put到队列中即可。
public class MyThreadPoolExecutor {
    //
    BlockingDeque<Runnable> queue = new LinkedBlockingDeque<>(1000);
    
    public MyThreadPoolExecutor(int n ) {
        //创建n个线程
        for (int i = 0; i < n; i++) {
            Thread thread = new Thread(() -> {
                try{
                    while(true) {
                        Runnable task = queue.take();
                        task.run();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
            thread.start();
        }
    }
    public void submit(Runnable task) throws InterruptedException {
        queue.put(task);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DC-2靶机通关详解以及可能问题的解决

靶机下载地址&#xff1a;https://www.vulnhub.com/entry/dc-2,311/ 可能问题 出现如图的问题最大的可能是因为我们的VMware的版本过高&#xff0c;我们只需要降低一下版本就可以了。 找到虚拟机选项&#xff0c;点开其中的管理选项&#xff0c;然后选择更改兼容性。 直接下一…

双11买什么最划算?盘点双11必买好物合集

2024的“双11”购物狂欢节也是正式拉开帷幕&#xff0c;大家有没有物色到心仪的好物呢&#xff1f;每年的双11&#xff0c;都是数码家电爱好者的盛宴。在这个时候&#xff0c;各大品牌纷纷推出优惠活动&#xff0c;各种新品也层出不穷&#xff0c;正是入手这些商品的绝佳时机。…

SpringCloud Alibaba-03 Sentinel服务熔断与限流

与CircuitBreaker功能类似 后台默认8719端口 前台默认8080端口 在jar包所在目录下打开CMD&#xff0c;执行 java -jar sentinel-dashboard-1.8.6.jar 命令即可 网址http://localhost:8080 账号密码都是sentinel 1.Sentinel微服务8401纳入Sentinel监控 1.1 建Module&#…

javascript-基础 (三)

循环-for for 循环-基本使用 1. for循环语法 作用&#xff1a; 重复执行代码 好处&#xff1a; 把声明起始值、循环条件、变化值写到一起&#xff0c;让人一目了然 &#xff0c; 它是最常使用的循环形式 for (变量起始;终止条件;变量变化量) {//循环体 } 例子&#xff1a; f…

论文阅读(二十六):Dual Attention Network for Scene Segmentation

文章目录 1.Introduction3.DANet3.1Position Attention Module3.2Channel Attention Module 论文&#xff1a;Dual Attention Network for Scene Segmentation   论文链接&#xff1a;Dual Attention Network for Scene Segmentation   代码链接&#xff1a;Github 1.Intr…

基于SSM+小程序民宿短租管理系统(民宿1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM小程序民宿短租管理系统实现了管理员、用户及房主 1、管理员可以管理民宿信息和订单信息用户管理、房主管理、房间类型管理、预定管理等。 2、房主可以管理自己的民宿和订单 3、…

图论基础复习【并查集 | 图遍历 | 最小生成树 | 3种最小路径算法】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;高阶数据结构_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一&#xff0c;并…

JAVA Maven 的安装与配置

一、下载地址 官方网站&#xff1a;Maven – Download Apache Maven 我这里是3.8.6版本 二、安装步骤 maven安装之前要先安装jdk&#xff0c;请确保你的系统已经安装了jdk环境。 1.将下载好的 Maven 进行解压 apache-maven-3.6.8-bin.zip 2.配置本地仓库:修改 conf/settin…

C++设计模式创建型模式———单例模式

文章目录 一、引言二、懒汉模式三、饿汉模式四、C11 的线程安全单例五、与其他模式的关系六、总结 一、引言 单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 在一个项目中&#xff0c;全局范围内&a…

HTML+CSS实现超酷超炫的3D立方体相册

效果演示 HTML和CSS实现一个简单的3D立方体加载动画的相册。它使用了HTML来构建立方体的结构&#xff0c;并通过CSS来添加样式和动画效果。 HTML <div class"loader3d"><div class"cube"><div class"face"><img src&qu…

如何对pdf文件进行加密?pdf文件加密全攻略与深度解析(5个方法)

如何对pdf文件进行加密&#xff1f; 只见&#xff0c;在深夜的情报局里&#xff0c;特工小李将一份绝密PDF文件放在保险箱内&#xff0c;以为这样就天衣无缝了。 细细推敲&#xff0c;漏洞百出&#xff1a; 如果钥匙被盗呢&#xff1f;如果被神匠破解出密码呢&#xff1f;如果…

java 提示 避免用Apache Beanutils进行属性的copy。

避免用Apache Beanutils进行属性的copy。 Inspection info: 避免用Apache Beanutils进行属性的copy。 说明&#xff1a;Apache BeanUtils性能较差&#xff0c;可以使用其他方案比如Spring BeanUtils, Cglib BeanCopier。 TestObject a new TestObject(); TestObject b new Te…

linux指令笔记

bash命令行讲解 lyt &#xff1a;是用户名 iZbp1i65rwtrfbmjetete2b2Z :这个是主机名 ~ &#xff1a;这个是当前目录 $ &#xff1a;这个是命令行提示符 每个指令都有不同的功能&#xff0c;大部分指令都可以带上选项来实现不同的效果。 一般指令和选项的格式&#xff1a;…

【openEuler/Centos】yum安装软件报Error: GPG check FAILED【分析根因弄明白,亲测有效不浪费时间】

yum安装软件报Error: GPG check FAILED 环境信息&#xff1a;cat /etc/openEuler-release openEuler release 22.03 (LTS-SP1) 报错信息 The downloaded packages were saved in cache until the next successful transaction. You can remove cached packages by executin…

当我们在微服务中使用API网关时,它是否会成为系统的瓶颈?这种潜在的瓶颈如何评估和解决?如何在微服务架构中保证高效请求流量?|API网关|微服务|异步处理

目录 1. API网关在微服务中的角色与重要性 2. API网关瓶颈的评估 2.1 请求延迟分析 2.2 并发请求量监控 2.3 内存和CPU使用情况 2.4 限流和熔断机制评估 2.5 日志分析 3. API网关瓶颈的解决方案 3.1 缓存机制优化 3.2 负载均衡优化 3.3 异步处理与消息队列 3.4 限流…

记录如何在RK3588板子上跑通paddle的OCR模型

官网文档地址 rknn_zoo RKNPU2_SDK RKNN Model Zoo 一、PC电脑是Ubuntu22.04系统中完成环境搭建(板子是20.04&#xff09; 安装模型转换环境 ​conda create -n rknn2 python3.10 conda activate rknn2 安装Ubuntu依赖包 su…

STM32 第18章 SysTick--系统定时器

时间:2024.10.26-10.27 参考资料: 《零死角玩转STM32》“SysTick--系统定时器”章节 一、学习内容 1.SysTick简介 1.1 SysTick: 系统定时器,24位,只能递减,存在于内核,嵌套在NVIC中,所有的Cortex-M内核的单片机都具有这个定时器。 官方参考手册里的介绍: 系统嘀…

riscv uboot 启动流程分析 - SPL启动流程

分析uboot 启动流程硬件&#xff1a;启明智显推出M4核心板 &#xff08;https://gitee.com/qiming-zhixian/m4-openwrt&#xff09; 1.U-boot和SPL概述 U-Boot 分为 uboot-spl 和 uboot 两个组成部分。SPL 是 Secondary Program Loader 的简称&#xff0c;第二阶段程序加载器。…

重塑在线软件开发新纪元:集成高效安全特性,深度解析与评估会员与促销管理系统的系统架构设计

案例 阅读以下关于软件架构设计与评估的叙述&#xff0c;回答问题1和问题2。 【题目】 某电子商务公司拟升级其会员与促销管理系统&#xff0c;向用户提供个性化服务&#xff0c;提高用户的粘性。在项目立项之初&#xff0c;公司领导层一致认为本次升级的主要目标是提升会员管…

简单的udp程序

文章目录 1. 预备知识1.1 源IP地址和目的IP地址1.2 端口号1.3 套接字初识1.4 tcp协议和udp协议简单认识1.5 网络字节序 2. udp程序2.1 创建套接字&#xff08;socket&#xff09;的系统调用2.2 bind()2.2.1 初始化一个sockaddr_in结构体2.2.2 inet_addr函数2.2.3 0.0.0.02.2.4 …