【并发编程篇】源码分析,手动创建线程池

文章目录

  • 🛸前言
    • 🌹Executors的三大方法
  • 🍔简述线程池
  • 🎆手动创建线程池
    • ⭐源码分析
    • ✨代码实现,手动创建线程池
      • 🎈CallerRunsPolicy()
      • 🎈AbortPolicy()
      • 🎈DiscardPolicy()
      • 🎈DiscardOldestPolicy()

在这里插入图片描述

🛸前言

🌹Executors的三大方法

Java 中的 Executors 类提供了创建和管理线程池的工厂方法。主要有以下三种常用的静态工厂方法:

  • newFixedThreadPool(int nThreads):固定的线程池大小
    创建一个固定大小的线程池,其中包含指定数量的线程。如果所有线程都处于活动状态,并且任务队列已满,那么新任务将在任务队列中等待,直到有空闲的线程可用。
    在这里插入图片描述

  • newCachedThreadPool():遇强则强,遇弱则弱
    创建一个可缓存的线程池,如果线程池的当前规模超过处理需求时,它会回收空闲线程;当需求增加时,则可以添加新的线程,线程池规模不存在限制。

在这里插入图片描述

  • newSingleThreadExecutor(): 单个线程
    创建一个单线程的线程池,该线程池只有一个工作线程,它保证所有任务按顺序执行。

在这里插入图片描述

这些工厂方法都返回实现了 ExecutorService 接口的 ThreadPoolExecutor 对象,这是 Java 线程池的一个具体实现,提供了对线程池的操作和控制。通过使用这些工厂方法创建线程池,可以方便快捷地满足不同场景下的线程管理需求。


请添加图片描述
由于使用Executors不安全,那么我们需要手动创建一个线程池

🍔简述线程池

线程池是一种用于管理和重用线程的机制,它通过预先创建一组线程,并将任务提交给这些线程来执行。线程池可以有效地控制并发线程的数量,避免了频繁创建和销毁线程的开销,提高了系统的性能和资源利用率。

线程池通常由以下组件构成:

  • 线程池管理器(ThreadPoolExecutor):负责创建、管理和调度线程池中的线程。它维护着一个线程池的状态,包括线程数量、任务队列、线程工厂等属性。
  • 工作线程(Worker Thread):线程池中的实际执行任务的线程。线程池会创建一定数量的工作线程,每个工作线程可以执行多个任务。
  • 任务队列(Task Queue):用于存储待执行的任务。当线程池中的线程空闲时,它们会从任务队列中获取任务并执行。
  • 线程工厂(Thread Factory):用于创建新的线程对象。线程池在需要创建新线程时,会使用线程工厂创建线程对象。

线程池的主要优点包括:

  • 提高系统性能:线程池可以控制并发线程的数量,避免了过多的线程竞争和频繁的线程创建销毁开销,提高了系统的性能。
  • 提高资源利用率:线程池可以重用线程,避免了线程创建和销毁的开销,提高了系统的资源利用率。
  • 提供线程管理和监控:线程池提供了对线程的管理和监控机制,可以方便地查看线程池的状态、线程执行情况等信息,便于调优和排查问题。

使用线程池时,需要根据具体的业务需求和系统资源情况合理配置线程池的大小、任务队列的容量以及其他相关参数,避免因线程池过小或过大导致的性能问题。

🎆手动创建线程池

⭐源码分析

newSingleThreadExecutor的源码
在这里插入图片描述newFixedThreadPool的源码
在这里插入图片描述newCachedThreadPool的源码
在这里插入图片描述其中有个参数长度是Integer,MAX_VALUE,长度过大,可能会堆积大量的请求,对应了上面我们说的不能用Executors,而要用ThreadPoolExecutors

我们发现,上面三者的源码中都有ThreadPoolExecutor
说明调用线程的本质调用的是ThreadPoolExecutor

下面我们来分析一下ThreadPoolExecutor
在这里插入图片描述在这里插入图片描述下面我们来想象一个场景,来更好的理解线程池
比如我们去银行办理业务
银行有5个窗口,但是只打开了2个(代表核心线程池的大小为2),还有3个没有开(触发最大并发量的情况下才会打开这3个窗口),还有容量为3的候客区(阻塞队列)
然后有用户去办理业务了,假如来了3个用户,2个去窗口了,还有1个在候客区等待,此时,又来了3个用户,这时候客区的位置不够了(阻塞队列满了),就要打开那关闭的3个窗口(触发最大并发量了)

✨代码实现,手动创建线程池

🎈CallerRunsPolicy()

package org.Test6;

import java.util.concurrent.*;

public class Demo01 {
    public static void main(String[] args) {
        //自定义线程池
        ExecutorService threadPool = new ThreadPoolExecutor(
                2,
                5,
                3,
                TimeUnit.SECONDS,   //超时等待时间
                new LinkedBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.CallerRunsPolicy());
        try {
            for (int i = 1; i <= 10; i++) {
                //使用线程池后,使用线程池来创建线程
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+"ok");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //关闭线程池
            threadPool.shutdown();
        }
    }
}

在这里插入图片描述

代码里面的超时等待时间是什么意思
我们对应上面去银行的场景,触发最大并发条件后,所有窗口都打开了,一段时间后,所有用户都离开了,过了设定的时间都没有业务,那么后面3个窗口就要关闭

🎈AbortPolicy()

package org.Test6;

import java.util.concurrent.*;

public class Demo01 {
    public static void main(String[] args) {
        //自定义线程池
        ExecutorService threadPool = new ThreadPoolExecutor(
                2,
                5,
                3,
                TimeUnit.SECONDS,   //超时等待时间
                new LinkedBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());
        try {
            for (int i = 1; i <= 10; i++) {
                //使用线程池后,使用线程池来创建线程
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+"ok");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //关闭线程池
            threadPool.shutdown();
        }
    }
}

在这里插入图片描述

🎈DiscardPolicy()

package org.Test6;

import java.util.concurrent.*;

public class Demo01 {
    public static void main(String[] args) {
        //自定义线程池
        ExecutorService threadPool = new ThreadPoolExecutor(
                2,
                5,
                3,
                TimeUnit.SECONDS,   //超时等待时间
                new LinkedBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardPolicy()
        );
        try {
            for (int i = 1; i <= 10; i++) {
                //使用线程池后,使用线程池来创建线程
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+"ok");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //关闭线程池
            threadPool.shutdown();
        }
    }
}

丢掉任务,但是不会抛出异常

在这里插入图片描述

🎈DiscardOldestPolicy()

package org.Test6;

import java.util.concurrent.*;

public class Demo01 {
    public static void main(String[] args) {
        //自定义线程池
        ExecutorService threadPool = new ThreadPoolExecutor(
                2,
                5,
                3,
                TimeUnit.SECONDS,   //超时等待时间
                new LinkedBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardOldestPolicy()
        );
        try {
            for (int i = 1; i <= 10; i++) {
                //使用线程池后,使用线程池来创建线程
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+"ok");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //关闭线程池
            threadPool.shutdown();
        }
    }
}

在这里插入图片描述

在技术的道路上,我们不断探索、不断前行,不断面对挑战、不断突破自我。科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。让我们携手并进,共同努力,开创美好的未来!愿我们在科技的征途上不断奋进,创造出更加美好、更加智能的明天!

在这里插入图片描述

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

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

相关文章

1.倒排索引 2.逻辑斯提回归算法

1.倒排索引 https://help.aliyun.com/zh/open-search/retrieval-engine-edition/introduction-to-inverted-indexes 倒排索引&#xff08;Inverted Index&#xff09;是一种数据结构&#xff0c;用于快速查找包含某个特定词或词语的文档。它主要用于全文搜索引擎等应用&#…

c#委托学习笔记1

委托三步骤 第一步&#xff1a;定义委托 //第一步&#xff1a;1 声明委托(定义委托) //对于声明委托的解释如下&#xff1a; //解释a&#xff1a;函数指针 //解释b&#xff1a;委托就是定义函数的形状&#xff08;形态&#xff09; // 即&#xff1a;返回值类型&#x…

代码随想录刷题题Day21

刷题的第二十一天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C Day21 任务 ● 216.组合总和III ● 17.电话号码的字母组合 1 组合总和III 216.组合总和III 思路&#xff1a; 在[1,2,3,4,5,6,…

数据孤岛:一场数据的独立战争

在当今数字化的时代&#xff0c;数据已成为企业和组织最宝贵的资产之一。然而&#xff0c;尽管数据的价值被广泛认可&#xff0c;但数据的分散和孤立问题却仍然存在&#xff0c;这就是所谓的数据孤岛。本文将重点分析什么是数据孤岛、数据孤岛的危害以及解决数据孤岛的传统和创…

C语言课程设计_运动会管理系统

本次课程设计利用《C语言程序设计》课程中所学到的编程知识和编程技巧&#xff0c;完成具有一定难度和工作量的程序设计题目&#xff0c;帮助学生掌握编程、调试的基本技能&#xff0c;独立完成所布置的任务。 要求 1、对系统进行功能需求分析 2、设计合理的数据结构和系统框…

分类预测 | Matlab实现MTF-CNN-Mutilhead-Attention基于马尔可夫转移场-卷积神经网络融合多头注意力多特征数据分类预测

分类预测 | Matlab实现MTF-CNN-Mutilhead-Attention基于马尔可夫转移场-卷积神经网络融合多头注意力多特征数据分类预测 目录 分类预测 | Matlab实现MTF-CNN-Mutilhead-Attention基于马尔可夫转移场-卷积神经网络融合多头注意力多特征数据分类预测分类效果基本描述程序设计参考…

HarmonyOS4.0系统性深入开发03UIAbility组件详解(中)

UIAbility组件基本用法 UIAbility组件的基本用法包括&#xff1a;指定UIAbility的启动页面以及获取UIAbility的上下文UIAbilityContext。 指定UIAbility的启动页面 应用中的UIAbility在启动过程中&#xff0c;需要指定启动页面&#xff0c;否则应用启动后会因为没有默认加载…

2024华为OD机试真题指南宝典—持续更新(JAVAPythonC++JS)【彻底搞懂算法和数据结构—算法之翼】

PC端可直接搜索关键词 快捷键&#xff1a;CtrlF 年份关键字、题目关键字等等 注意看本文目录-快速了解本专栏 文章目录 &#x1f431;2024年华为OD机试真题&#xff08;马上更新&#xff09;&#x1f439;2023年华为OD机试真题&#xff08;更新中&#xff09;&#x1f436;新…

Python字符串处理全攻略(三):常用内置方法轻松掌握

目录 引言Python字符串常用内置方法str.index()功能介绍语法注意事项总结 str.startswith()功能介绍语法示例注意事项 str.expandtabs()功能介绍语法示例注意事项总结 str.splitlines()功能介绍语法示例注意事项总结 str.swapcase()功能介绍语法示例注意事项 结束语 引言 欢迎…

XUbuntu22.04之跨平台容器格式工具:MKVToolNix(二百零三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【Hadoop】Zookeeper是什么?怎么理解它的工作机制?

Zookeeper是什么Zookeeper工作机制 Zookeeper是什么 Zookeeper是一个开源的分布式的&#xff0c;为别的分布式矿建提供协调服务的Apache项目。分布式简单地理解就是多台机器共同完成一个任务。 Zookeeper工作机制 从设计模式的角度来理解&#xff0c;是一个基于观察者模式设…

css学习笔记6(盒子模型)

CSS盒子模型 五、CSS盒子模型1.CSS长度单位2.元素的显示模式3.总结各元素的显示模式4.修改元素显示模式5.盒子模型的组成6.盒子内容区&#xff08;content&#xff09;7.关于默认宽度8.盒子内边距&#xff08;padding&#xff09;9.盒子边框&#xff08;border&#xff09;10.盒…

深度学习入门(python)考试速成均方误差

均方误差 表示神经网络的输出&#xff0c;表示监督数据&#xff0c;表示数据的维度。 这里神经网络的输出y是softmax函数的输出 数组元素的索引从第一个开始依次对应数组“0”&#xff0c;“1”&#xff0c;“2”&#xff0c;...... 由于softmax函数的输出可理解为概率 由此…

指针的含义

我们还取前面图片解释的道理&#xff1a; pa表示的意思就是这个地址&#xff0c;并不会显示出10这个数字 *pa就是指针&#xff0c;最后指向了a10&#xff0c;所以他最后程序输出是10 &pa这个含义就是取pa的地址&#xff0c;那么pa是一个虚拟的地址&#xff0c;只是简单的…

概率中的50个具有挑战性的问题[02/50]:连续获胜

一、说明 我最近对与概率有关的问题产生了兴趣。我偶然读到了弗雷德里克莫斯特勒&#xff08;Frederick Mosteller&#xff09;的《概率论中的五十个具有挑战性的问题与解决方案》&#xff08;Fifty Challenge Problems in Probability with Solutions&#xff09;一书。我认为…

python实现图像的几何变换——冈萨雷斯数字图像处理

1、 实现图像的平移。 原理: 图像的平移是一种基本的图像处理操作&#xff0c;它将图像中的每个像素沿着指定的方向和距离移动&#xff0c;以创建一个新的平移后的图像。平移的原理很简单&#xff0c;通常涉及到以下几个步骤&#xff1a; 确定平移的距离和方向&#xff1a;首先…

2024苹果手机iOS管理软软件iMazing2.17永久免费版下载教程

iMazing2024是一款专业的苹果IOS设备管理器&#xff0c;强悍的性能远超苹果的iTunes&#xff0c;iMazing 能让广大果粉能已自己的方式管理苹果设备&#xff0c;无需iTunes即可畅快传输或者保存苹果设备中的音乐、消息、文件以及其他数据。 iMazing2Mac-最新绿色安装包下载如下&…

下一站,上岸@24考研er

时间过的好快&#xff0c; 考研倒计时①天 去年这个时候&#xff0c; 我应该也是充满未知地进入即将来到的考研初试 去年&#xff0c;这个时候&#xff0c;疫情&#x1f637;刚刚放开 许多人都&#x1f411;&#xff0c;发烧&#xff0c;可幸的是我受影响不大 &#x1f3…

供应链 | 顶刊MSOM论文精选——关税对全球供应链网络配置的影响:模型、预测和未来研究

编者按 关税对企业全球供应链网络设计决策的影响 本文为 M&SOM期刊20周年特邀论文&#xff0c;原文信息&#xff1a; Lingxiu Dong, Panos Kouvelis (2020) Impact of Tariffs on Global Supply Chain Network Configuration: Models, Predictions, and Future Research…

MySQL 数据库系列课程 05:MySQL命令行工具的配置

一、Windows启动命令行工具 &#xff08;1&#xff09;打开 Windows 的开始菜单&#xff0c;找到安装好的 MySQL&#xff0c;点击MySQL 8.0 Command Line Client - Unicode&#xff0c;这个带有 Unicode 的&#xff0c;是支持中文的&#xff0c;允许在命令行中敲中文。 &…