对多线程中线程池的理解

news2025/1/17 21:48:04

一.概念理解

何为线程池?

线程池的释义正如它的命名:专门用来存放线程的池子(集合类),也就是将线程存储于集合类,使用时从线程池中直接获取,使用结束后将线程放回集合类即可,这样就避免了线程频繁的创建和销毁。

为什么要使用线程池?

我们使用多线程的目的在于利用线程间的阻塞空隙,来提高效率。但是我们使多线程时不免创建多个线程,线程的创建虽然相比于进程的创建所用的开销要小很多,但是线程频繁的开启和销毁仍然会降低处理任务的效率,所以线程池应运而生。我们都知道,创建系统层面的线程需要JVM调用系统层面的API,通过系统创建PCB实现线程的创建,这是在系统中的内核态中完成的,而我们JAVA中实现的功能是在JAVA 层面的用户态中实现的,为了提高效率,我们尽量将工作安排在用户态中,而线程池也是基于这种思想下创建的。

好处:

  1. 降低资源消耗:减少线程的创建和销毁带来的性能开销。

  1. 提高响应速度:当任务来时可以直接使用,不用等待线程创建

  1. 可管理性: 进行统一的分配,监控,避免大量的线程间因互相抢占系统资源导致的阻塞现象。

二.如何使用线程池?

   //1.用来处理大量短时间工作任务的线程池,如果池中没有可用的线程将创建新的线程,线程空闲60s则会被回收
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        //2.创建一个无界队列且固定大小的线程池
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
        //3.创建一个无界队列且只有一个工作线程的线程池
        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        //4.创建一个单线程执行器,可以在给定时间后执行或者定期执行
        ScheduledExecutorService singleScheduleExecutor = Executors.newSingleThreadScheduledExecutor();
        //5.创建一个指定大小的线程池,可以在给定时间后执行或者是定期执行
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
        //6.创建一个指定大小的线程池(不指定大小则为当前机器的cpu核心数),并行执行任务,不保证执行顺序
        ExecutorService workStealingPool = Executors.newWorkStealingPool();

JVM提供了6种默认的线程池,分别对应不同的应用场景,但是事实上我们很少用JVM提供的线程池,而是根据我们自己的业务场景创建自定义的线程池。为什么呢?一是因为系统提供的线程池难以满足我们的业务场景,二是当线程创建临时线程时,直接创建最大线程容量,因此在这种开辟策略下 系统提供的默认线程池开销极大。

而JVM提供的线程池体现了通过提供不同的方法来获取不同的线程池,这便是工厂模式的体现,在这里关于工厂模式我们不做过多介绍,大家参考以下博客:https://blog.csdn.net/weixin_43757333/article/details/126294625

三.我们手动实现一个线程池

我们先说一下线程池的实现思路:①自定义实现MyThreadPool类,其中通过阻塞队列实现对任务的存储②通过submit()方法将任务提交至阻塞队列中③通过类中的构造方法将任务通过不同的线程取出并执行

代码如下:

public class MyThreadPool {
   BlockingQueue<Runnable>runnables=new LinkedBlockingQueue<>();//阻塞队列
   //创建提交任务的方法
   public void submit(Runnable runnable) throws InterruptedException {
       runnables.put(runnable);
   }
   //创建取出任务的方法(构造方法)
    public MyThreadPool(int num){
       //检查num的合法性
        if(num<=0){
            throw new RuntimeException("输入的数字不合法");
        }
        //循环进行不断创建线程
        for(int i=0;i<num;++i){
             Thread thread =new Thread(()->{
                 while (true){
                     try {
                         Runnable take = runnables.take();
                         take.run();
                     } catch (InterruptedException e) {
                         throw new RuntimeException(e);
                     }
                 }

             });
             thread.start();
        }
    }
}

四.创建系统自带的线程池

我们通过一个实际生活中的例子来对这些概念进行解释:

那么线程池的工作流程是怎样的呢?

关于四种不同的拒绝策略:

创建方式如下:

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

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

相关文章

macOS Ventura 13.2 (22D49) Boot ISO 原版可引导镜像

本站下载的 macOS Ventura 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。 2023 年 1 月 23 日&#xff08;北京时间 24 日凌晨&#xff09;&#xff0c;m…

基于电流型磁链观测器的异步电机矢量控制学习

导读&#xff1a;本期主要介绍电流型磁链观测器&#xff08;current flux observer&#xff09;在不同坐标系下的表现形式&#xff0c;应用在异步电机矢量控制系统中。如需要文中的仿真模型&#xff0c;关注微信公众号&#xff1a;浅谈电机控制&#xff0c;获取。一、引言磁链估…

JavaEE day4 初识HTML+总结3

FORM表单的常见type属性 FORM表单的tpye属性非常多&#xff0c;这里只介绍常见的几个&#xff1a; text &#xff1a; 输入普通文本&#xff0c;例如登录注册下的用户名 password &#xff1a; 输入密码文本&#xff0c;例如登录注册下的密码&#xff0c;隐藏用户的输入 ra…

如何使用JDBC操作数据库,JDBC实战案例详细解读

1. 前言 前面 3 篇 JDBC 入门级基础文章中&#xff0c;我们已经探讨了什么是 JDBC&#xff0c;如何使用JDBC 操作数据库&#xff0c;JDBC API 详细解读&#xff0c;以及数据库连接池的基础等。文章带来的反馈还不错&#xff0c;今天我们使用前面学习的内容做一个实战案例训练。…

贪心 135. 分发糖果

135. 分发糖果 难度困难1086 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&…

uboot启动流程简要版(基于armv7)

uboot启动流程&#xff08;armv7&#xff09; uboot介绍 uboot就是一段引导程序&#xff0c;在加载系统内核之前&#xff0c;完成硬件初始化&#xff0c;内存映射&#xff0c;为后续内核的引导提供一个良好的环境。 uboot是bootloader的一种&#xff0c;全称为universal boot…

二叉树基础oj练习

1.单值二叉树 题目: 力扣https://leetcode.cn/problems/univalued-binary-tree/ 思路: 单值二叉树 root和左右孩子的值相等 左子树是单值二叉树 右子树是单值二叉树 代码: /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeN…

CSS 艺术之心形-彩虹-加载动画

CSS 艺术之心形-彩虹-加载动画&#xff08;居中抖动问题&#xff09;参考描述效果HTMLCSS重置元素的部分默认样式bodyli动画定义指定animationul居中抖动问题代码总汇参考 项目描述搜索引擎BingMDNMDN Web Docs 描述 项目描述Edge109.0.1518.61 (正式版本) (64 位) 效果 HTML…

【Vue笔记】Vue中默认插槽slot、具名插槽slot、自定义组件的v-model属性的使用

这篇文章&#xff0c;主要介绍Vue中默认插槽slot、具名插槽slot、自定义组件的v-model属性的使用。 目录 一、插槽slot介绍 1.1、默认插槽 1.2、具名插槽 &#xff08;1&#xff09;如何定义具名插槽&#xff1f;&#xff1f;&#xff1f; &#xff08;2&#xff09;如何使…

3DMAX纹理插件BerconMaps使用教程

BerconMaps是3dMax的第三方纹理插件。它添加了五个新的3dMax纹理贴图&#xff1a;噪波&#xff08;Noise&#xff09;、木纹&#xff08;Wood&#xff09;、瓷砖&#xff08;Tile&#xff09;、失真&#xff08;Distortion&#xff09;和渐变&#xff08;Gradient&#xff09;。…

linux配置samba服务

文章目录samba服务第一步&#xff1a;下载samba服务第二步&#xff1a;开启服务&#xff0c;查看服务状态第三步&#xff1a;在文件夹系统查看第四步&#xff1a;设置samba的配置文件第五步&#xff1a;再次去尝试连接linux服务共享修改smab服务的配置设置samba服务的用户名和密…

verilog实现计算器设计

该实验为用verilog编写的一个运算系统,其功能是实现4位整数的加、减、乘、除运算。运算时通过矩阵键盘输入运算类型和运算所需要的数据,然后通过内部电路处理,将计算的结果送于数码管或LCD1602显示。 工程截图如下: 本设计分为两个子模块,按键输入和数码管输出。 还有LC…

python字符串

python字符串 文章目录python字符串一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.字符串创建2.转义字符3.运算符4.格式化5.三引号6.内建函数总结一、实验目的 掌握字符串的用法 二、实验原理 字符串 字符串是一种序列&#xff0c;用于表示和存储文本。py…

Ubuntu16.04安装Chrome出错

安装了Ubuntu16.04之后想要装个Chrome&#xff0c;本来觉得是很简单的事情&#xff0c;下载->安装就结束了&#xff0c;结果没想到搞了好久&#xff0c;最后发现是因为自己偷懒所造成的&#xff01;因此&#xff0c;写下这篇博文做警示&#xff0c;如果其他人也碰到这样的问…

20230124使AIO-3568J开发板在Android12下横屏

20230124使AIO-3568J开发板在Android12下横屏 2023/1/24 14:05 百度搜索&#xff1a;RK3568 强制横屏 http://www.360doc.com/content/12/0121/07/29321110_1049371522.shtml RK3568 Android-HDMI旋转屏幕显示 硬件开发板&#xff1a;OK3568-C开发板&#xff08;基于国产瑞芯微…

【Leetcode每日一题】34.在排序数组中查找元素的第一个和最后一个位置|二分求下标

&#x1f331;博主简介&#xff1a;大一计科生&#xff0c;努力学习Java中!热爱写博客~预备程序媛 &#x1f4dc;所属专栏&#xff1a;LeetCode每日一题–进击大厂 ✈往期博文回顾: 【Leetcode每日一题】35.搜素插入位置|二分查找数组下标 &#x1f575;️‍♂️近期目标&#…

恶意代码分析实战 5 分析恶意Windows程序

1 Lab07-01 本次实验分析lab07-01.exe,lab07-02.exe,先来看lab07-01.exe的问题 问题 计算机重启后&#xff0c;这个程序如何确保它继续运行&#xff08;达到持久化驻留&#xff09; 首先&#xff0c;查看导入函数。 OpenSCManagerA和CreateServiceA函数暗示着这个恶意代码…

蓝队-HTTP协议的分析

文章目录应用层的协议→HTTP协议访问地址web网站的正确访问姿势请求协议https访问的密钥文件网站的部署通过https协议访问请求报文响应报文请求方法http头协议cookiesRefererUser-AgentX-Forwarded-ForHTTP 状态码HTTP content-type抓包分析HTTP抓包代理插件的下载代理第一种方…

电商项目之同一笔单多次收款成功

1 问题背景 有个收单系统&#xff08;简称S系统&#xff09;&#xff0c;作用是收单&#xff0c;相当于支付渠道&#xff0c;能够作为第三方服务对接其他支付平台。电商系统&#xff08;简称A系统&#xff09;与S系统是隔离的。A系统发起支付请求给S系统&#xff0c;S系统包装一…

Java高效率复习-坦克大战[Java基础合集]

目录 前言 该文章会从零开始制作一个坦克大战的游戏&#xff0c;该游戏使用Java的AWT和Swing作为窗体和容器&#xff0c;使用面向对象、线程等技术来丰富游戏&#xff0c;本文章相等于Java前期和中期技术的一个合集&#xff08;对于IO、网络、反射并没有涉及到&#xff09;。 …