线程池 (通俗易懂)

news2024/11/14 15:21:20

线程池

  • 一、线程池是什么
  • 二、标准库中的线程池
  • 三、实现线程池
    • 3.1 思路与细节
    • 3.2 完整代码
  • 四、标准库里的构造方法

一、线程池是什么

之前我们已经认识过"池":String,字符串常量池;MySQL JDBC,数据库连接池(DataSource)…

线程诞生的原因是进程太重量了,导致创建进程/销毁进程比较低效 (内存资源的申请和释放)!而线程就是共享了内存资源,新的线程复用之前的资源,不必重新申请了 (快了)~~
但是如果线程创建的频率高了,此时线程创建销毁的开销仍然不能忽略!
此时就可以使用线程池来进一步优化这里的速度了!!!

在这里插入图片描述
在这里插入图片描述

用户态:每个进程都是自己执行自己的逻辑;
内核态:一个系统里只有这一份内核在执行逻辑,这个内核要给所有的进程都提供一些服务!
在这里插入图片描述
最终的结论:使用线程池是纯用户态操作,要比创建线程 (经历内核态的操作)要快~~
线程池最大的好处就是减少每次启动、销毁线程的损耗!

总结三点:

  • 降低资源消耗:减少线程的创建和销毁带来的性能开销。
  • 提高响应速度:当任务来时可以直接使用,不用等待线程创建。
  • 可管理性:进行统一的分配、监控,避免大量的线程间因互相抢占系统资源导致的阻塞现象。

二、标准库中的线程池

  • 使用 Executors.newFixedThreadPool(10) 能创建出固定包含 10 个线程的线程池
  • 返回值类型为 ExecutorService
  • 通过 ExecutorService.submit 可以注册一个任务到线程池中
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Demo26 {
    public static void main(String[] args) {
        ExecutorService pool = Executors.newCachedThreadPool();
        pool.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("这是任务");
            }
        });
    }
}

Executors 创建线程池的几种方式

  • newFixedThreadPool:创建固定线程数的线程池
  • newCachedThreadPool:创建线程数目动态增长的线程池
  • newSingleThreadExecutor:创建只包含单个线程的线程池
  • newScheduledThreadPool:设定延迟时间后执行命令,或者定期执行命令,是进阶版的Timer

Executors 本质上是 ThreadPoolExecutor 类的封装。
ThreadPoolExecutor 提供了更多的可选参数,可以进一步细化线程池行为的设定。

三、实现线程池

3.1 思路与细节

一个线程池可以同时提交N个任务,对应的线程池中有M个线程来负责完成这N个任务,如何把N个任务分配给M个线程呢?

生产者消费者模型正好可以解决这个问题!
先搞一个阻塞队列,每个被提交的任务都被放到阻塞队列中。搞M个线程来取队列元素。如果队列空了,M个线程自然阻塞等待;如果队列不为空,每个线程都取任务、执行任务,完了再来取下一个…直到队列为空,线程继续阻塞~~

在这里插入图片描述
注意:
1)阻塞队列能够保证线程安全~
2)Thread的线程跑起来之后,在执行过程中,是不会被提前销毁的!run() 执行完了才会被销毁~
3)线程什么时候结束呢?不用结束!因为无法判定啥时候会有新的线程过来!
一般还是在服务器开发中会更常用到线程池,这时线程池肯定是要持续工作的了~
如果非要结束,单独写一个shutdown方法,强制interrupt所有的工作线程 (如果你要写shutdown,后面是需要操作这些线程实例的,所以需要用数组保存起来)

3.2 完整代码

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

class MyThreadPool {
    private BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();

    public void submit(Runnable runnable) throws InterruptedException {
        queue.put(runnable);
    }

    public MyThreadPool(int m) {
        // 在构造方法中, 创建出 M 个线程. 负责完成工作.
        for (int i = 0; i < m; i++) {
            Thread t = new Thread(() -> {
                while (true) {
                    try {
                        Runnable runnable = queue.take();
                        runnable.run();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            t.start();
        }
    }
}

public class Demo {
    public static void main(String[] args) throws InterruptedException {
        MyThreadPool pool = new MyThreadPool(10);
        for (int i = 0; i < 1000; i++) {
            int taskId = i;  // i是一直在变化的,所以我们创建一个新的变量在Runnable进行捕获!
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("执行当前任务: " + taskId + " 当前线程: " + Thread.currentThread().getName());
                }
            });
        }
    }
}

四、标准库里的构造方法

标准库里提供的 ThreadPoolExecutor 其实要更复杂一些,尤其是构造方法,可以支持很多参数,可以支持很多选项,让我们来创建出不同风格的线程池~~

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【案例实践】EKMA曲线及大气O3来源解析

【查看原文】EKMA曲线及大气O3来源解析实践技术应用 目前&#xff0c;大气臭氧污染成为我国“十四五”期间亟待解决的环境问题。臭氧污染不仅对气候有重要影响&#xff0c;而且对人体健康、植物生长均有严重损害。为了高效、精准地治理区域大气臭氧污染&#xff0c;首先需要了…

【OpenCV学习】第14课:边缘检测与自定义线性滤波(卷积, Rebert算子, Sobel算子, 拉普拉斯算子)

仅自学做笔记用,后续有错误会更改 参考文章&#xff1a;http://t.zoukankan.com/whw1314-p-12007928.html 理论 卷积的概念&#xff1a; 在图像上使用卷积的目的&#xff1a;模糊图像&#xff0c; 提取边缘轮廓&#xff0c; 图像锐化等 卷积如何工作&#xff1a; 下边给出…

MATLB|基于燃料电池混合动力汽车双层凸优化

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

算法基础篇-01-时间复杂度和空间复杂度

1. 用什么表示算法的运行快慢&#xff1f; n 代表是算法里面的问题规模&#xff0c;n越大&#xff0c;运算越慢&#xff0c;比如n1和n100肯定是不一样的&#xff1b;机器不一样&#xff0c;相同的算法代码运行所消耗的时间也不一样&#xff1b; 2. 借用生活中的案例 类比生活中…

[附源码]Python计算机毕业设计SSM基于的校园卡管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

鸿蒙开发初体验以及遇到的几点坑

今天尝试了一下鸿蒙开发&#xff0c;有一些经验跟大家进行分享。建议大家先看完我的文章&#xff0c;再去尝试鸿蒙。 我安装好了开发工具&#xff0c;并且跑通了Hello World程序。同时&#xff0c;我还跑通了小鸿网课Java版本项目&#xff1a; 感觉&#xff0c;还好吧… 操作…

[附源码]Python计算机毕业设计SSM基于的小型房屋租赁平台(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

WordPress后台添加顶级菜单add_menu_page()函数的用法及实例代码

WordPress后台管理页面包括文章、多媒体、链接、页面、评论、外观、插件......等等主菜单选项&#xff0c;我们在开发主题和插件的时候经常需要在后台添加菜单。 目录 一、WordPress后台添加顶级菜单 概述 一、add_menu_page()函数介绍 三、参数详解 四、Wordpress默认菜…

零基础怎么入门Python?

“零基础可以学习Python吗&#xff1f;” 这是很多初学者经常问的一个问题&#xff0c;我的回答是可以&#xff01; 现在很多小学、初中也开始学习编程语言&#xff0c;选择的入门语言就是Python。 Python其实和学中文没什么区别&#xff0c;学习中文是为了更好的和人沟通&a…

【redis事务】@Transactional对Redis事务起作用(包含redis+lua)

【redis事务】Transactional对Redis事务起作用&#xff08;包含redislua&#xff09;一、前言二、准备三、StringRedisTemplate 开启事务四、关键代码&#xff08;验证Transactional对redis事务是否生效&#xff09;五、关键代码&#xff08;验证Transactional对redislua是否生…

回顾Redis之对象与数据结构

引言 Redis是一款基于键值对的数据结构存储系统&#xff0c;它的特点是基于内存操作、单线程处理命令、IO多路复用模型处理网络请求、键值对存储与简单丰富的数据结构等等 这篇文章主要围绕Redis中的对象与数据结构来详细说明键值对存储与简单丰富的数据结构这两大特点 Redi…

CSS 实现一个3d魔方

前言 &#x1f44f;CSS 实现一个3d魔方&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现步骤 魔方的一面为九个圆角正方形&#xff0c;定义正方形的宽高为–w&#xff0c;九个正方形的直接的间距为–gap&#xff0c;…

Spring整合其他技术

Spring整合其他技术 1 Spring整合mybatis 1.1 思路分析 问题导入 mybatis进行数据层操作的核心对象是谁&#xff1f; 1.1.1 MyBatis程序核心对象分析 1.1.2 整合MyBatis 使用SqlSessionFactoryBean封装SqlSessionFactory需要的环境信息 使用MapperScannerConfigurer加载…

安卓玩机搞机技巧综合资源----手机显秒设置 多种方式【十一】

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…

电子学会2020年9月青少年软件编程(图形化)等级考试试卷(二级)答案解析

目录 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 二、判断题&#xff08;共10题&#xff0c;每题2分&#xff0c;共20分&#xff09; 三、编程题【该题由测评师线下评分】&#xff08;共2题&#xff0c;共30分&#xff09; 青少年软件…

软件安全设计(威胁建模实现)

目录 一、实验目的 二、实验软硬件要求 三、实验预习 四、实验内容&#xff08;实验步骤、测试数据等&#xff09; 实验步骤 确定安全目标 创建在线学习系统概况图 分解在线学习系统 确定威胁 威胁评估 确定威胁缓解计划或策略 验证和记录威胁 一、实验目的 熟悉软…

[附源码]JAVA毕业设计医院管理系统(系统+LW)

[附源码]JAVA毕业设计医院管理系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

Spring Cloud Feign的自定义配置及使用

Feign 提供了很多的扩展机制&#xff0c;让用户可以更加灵活的使用&#xff0c;这节我们来学习 Feign 的一些自定义配置。 日志配置 有时候我们遇到 Bug&#xff0c;比如接口调用失败、参数没收到等问题&#xff0c;或者想看看调用性能&#xff0c;就需要配置 Feign 的日志了…

遥感影像(tif,img)概览/金字塔(overviews)的创建与清除

使用python环境下的gdal进行遥感影像&#xff08;tif&#xff0c;img格式&#xff09;概览&#xff08;overviews&#xff09;的创建与清除&#xff0c;前边是测试过程&#xff0c;结论在最后 过程 问题起因是拿到一批img格式的影像需要转cog&#xff0c;程序运行中报了个错 …

ESXi8.0安装,实体机安装,IPMI远程安装实战笔记

目录 1.前言 2.连接主板IMPI 3.硬件兼容及BIOS设置 4.从U盘安装ESXi ESXi8.0安装包下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1-a3ka1TAScFPtAc29jcxzQ 提取码&#xff1a;qwhg 1.前言 ESXi系列的虚拟机直接以操作系统的形态出现&#xff0c;与基于Li…