多线程(线程池)

news2024/11/15 4:01:59

线程池

池的概念意味着可以复用, 减少创建, 销毁线程的消耗
即事先把需要使用的线程创建好, 放到 “池” 中, 需要的时候从 “池” 里取, 用完再放回 池里取
这样全程只创建和销毁线程一次(之说是一次哦, 没说一次创建和销毁多少个)即可


标准库线程池的使用

public class Main{
    public static void main(String[] args) {
	    // 使用工厂方法创建线程池 (工厂方法其实是为了"填构造方法的坑 ... 此处不细说了")
        ExecutorService pool = Executors.newFixedThreadPool(10); //线程池的大小设置为 10 ,即该线程池中有10个线程
        for (int i = 0; i < 1000; i++) {
            int x = i; //这里不用i, 而是再写个x. 是因为变量捕获
            pool.submit(new Runnable() { //每一次往线程池中提交一个任务, 都会使得池中空闲的一个线程来执行该任务, 任务执行完毕后, 该线程再回到线程池, 以待下次使用
                @Override
                public void run() {
                    System.out.println("hello " + x);
                }
            });
        }
    }
}

运行结果

在这里插入图片描述

可以看到, 打印的结果是无序的, 说明线程池中线程拿到任务后,依旧是抢占式执行, 随机调度
循环结束后,进程并未结束, 说明线程池中的线程, 都是 前台线程


Executors 创建线程池的几种方式

在这里插入图片描述

而 Executors 本质上是 ThreadPoolExecutor 类的封装


ThreadPoolExecutor

ThreadPoolExecutor 提供了更多的可选参数, 可进一步细化线程池行为的设定

Java 官方文档中可以查看 ThreadPoolExecutor 类的构造方法

在这里插入图片描述

我们来仔细研究一下构造方法的参数
corePoolSize: 核心线程数量
maximumPoolSize: 最大线程数量 (核心线程 + 临时线程)
keepAliveTime: 临时线程的最大存活时间(如果无任务运行的话)
unit: 时间的单位(时分秒 …)
workQueue: 线程池的任务队列
threadFactory: 创建线程的工厂, 参与具体的创建线程工作
handler: 拒绝策略

其中拒绝策略参数有以下几个:

在这里插入图片描述

拒绝策略: 如果任务队列已满, 仍往阻塞队列里添加任务, 那么将采取先选定策略来应对
ThreadPoolExecutor.AbortPolicy: \ 就直接抛出异常
ThreadPoolExecutor.CallerRunsPolicy: 多出来的任务, 谁添加的, 谁负责执行
ThreadPoolExecutor.DiscardOldestPolicy: 丢弃最早的任务
ThreadPoolExecutor.DidcardPolicy: 丢弃最新添加的任务


手写线程池 (简单实现)

主要是依靠 BlockingQueue – 阻塞队列来实现的, 阻塞队列在我之前的博客里也手写过, 所以在此算是偷懒了

// 手写线程池

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

    // 创建含有 n 个线程的线程池 (构造方法)
    public MyThreadPool(int n) {
        for (int i = 0; i < n; i++) {
            Thread t = new Thread(() -> {
                while(true) {
                    try {
                        Runnable runnable = queue.take();
                        runnable.run();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            t.start();
        }
    }

    // 注册任务给线程池
    public void submit(Runnable runnbale) {
        try {
            queue.put(runnbale);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public class Main{
    public static void main(String[] args) {
        MyThreadPool pool = new MyThreadPool(10);
        for(int i=0;i<1000;i++) {
            int n = i;
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("hello " + n);
                }
            });
        }
    }
}

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

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

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

相关文章

【解读】区块链和分布式记账技术标准体系建设指南

大家好&#xff0c;这里是苏泽。一个从业Java后端的区块链技术爱好者。 今天带大家来解读这份三部门印发的行业建设指南《区块链和分布式记账技术标准体系建设指南》 原文件可查看P020240112840724196854.pdf (www.gov.cn) 以下是个人解读&#xff0c;如有纰漏请指正&#xff…

学习Android的第二十八天

目录 Android Service (服务) 线程 Service (服务) Service 相关方法 Android 非绑定 Service startService() 启动 Service 验证 startService() 启动 Service 的调用顺序 Android 绑定 Service bindService() 启动 Service 验证 BindService 启动 Service 的顺序 …

《LeetCode热题100》笔记题解思路技巧优化_Part_3

《LeetCode热题100》笔记&题解&思路&技巧&优化_Part_3 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题链表&#x1f7e2;1. 相交链表&#x1f7e2;2. 反转链表&…

html5cssjs代码 020 推荐网址

html5&css&js代码 020 推荐网址 一、代码二、解释 这段HTML代码定义了一个网页&#xff0c;它包含了一个标题、一些样式和一个表格。表格中列出了一些推荐的网址&#xff0c;包括序号、名称、网址、描述和备注。每个表格行都包含一个链接到相应网址的超链接。页面的样式…

一种基于宏和serde_json实现的rust web中统一返回类

本人rust萌新&#xff0c;写web碰到了这个&#xff0c;基于ChatGPT和文心一言学了宏&#xff0c;强行把这玩意实现出来了&#xff0c;做个学习记录&#xff0c;如果有更好的方法&#xff0c;勿喷。 先看效果&#xff0c;注意不支持嵌套&#xff0c;且kv映射要用>(因为它这个…

《JAVA与模式》之抽象工厂模式

系列文章目录 文章目录 系列文章目录前言一、使用简单工厂模式的解决方案二、引进抽象工厂模式三、抽象工厂模式结构四、抽象工厂模式的优缺点前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看…

MC78L05ACDR2G线性稳压器芯片中文资料规格书PDF数据手册引脚图参数图片价格

产品概述&#xff1a; MC78L00A系列线性稳压器价格便宜&#xff0c;易于使用&#xff0c;适用于各种需要最高100mA的调节电源的应用。与大功率MC7800和MC78M00系列一样&#xff0c;这款稳压器也提供内部电流限制和高温关断&#xff0c;因此非常坚固耐用。在很多应用中&#xf…

提高工作效率,这 10 款 AI 工具不能错过

作为一个职场打工人&#xff0c;我深知时间和效率的重要性。正是因为如此&#xff0c;我开始使用各种人工智能工具来帮助我提高工作效率。在这篇文章中&#xff0c;我将会分享 10 款必备的 AI 工具&#xff0c;这些工具可以让你的工作更加高效&#xff0c;从而为你节省更多的时…

windows 11访问Debian10上的共享目录

步骤 要在Windows 11上访问Debian 10.0.0的共享目录&#xff0c;可以通过以下步骤来实现&#xff1a; 1. 设置Samba服务&#xff1a;在Debian系统上&#xff0c;需要安装并配置Samba服务&#xff0c;以便能够实现文件夹共享。Samba是一个允许Linux/Unix服务器与Windows操作系…

Windows系统搭建Cloudreve结合内网穿透打造可公网访问的私有云盘

目录 ⛳️推荐 1、前言 2、本地网站搭建 2.1 环境使用 2.2 支持组件选择 2.3 网页安装 2.4 测试和使用 2.5 问题解决 3、本地网页发布 3.1 cpolar云端设置 3.2 cpolar本地设置 4、公网访问测试 5、结语 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff…

C#,数值计算,数据测试用的对称正定矩阵(Symmetric Positive Definite Matrix)的随机生成算法与源代码

C.Hermite 1、对称矩阵 对称矩阵(Symmetric Matrices)是指以主对角线为对称轴,各元素对应相等的矩阵。在线性代数中,对称矩阵是一个方形矩阵,其转置矩阵和自身相等。1855年,埃米特(C.Hermite,1822-1901年)证明了别的数学家发现的一些矩阵类的特征根的特殊性质,如称为埃…

AI智能电话机器人的核心技术是什么?

电话机器人是近几年兴起的人工智能产品&#xff0c;它主要通过电话群呼潜在客户&#xff0c;沟通进行信息筛选&#xff0c;帮助企业选择意向客户。企业使用电话机器人可以减少人工成本&#xff0c;提高工作效率。我们一起来看看智能电话机器人的核心技术是什么&#xff1f; 电话…

Tengine编译安装

首先下载源码 可以去官网&#xff1a;The Tengine Web Server 当前最新版地址&#xff1a;https://tengine.taobao.org/download/tengine-3.1.0.tar.gz 安装编译依赖 yum -y install gcc pcre-devel zlib-devel openssl-devel libxml2-devel \libxslt-devel gd-devel GeoIP…

安装linux_centos7虚拟机_开启网络_ssh_防火墙

文章目录 安装linux_centos7虚拟机_开启网络_ssh_防火墙安装centos7虚拟机1. 进入VMware --> 点击文件 --> 新建虚拟机2. 选择典型 --> 选择下一步3. 选择--> 稍后安装操作系统4. 选择--> Linux --> CentOS 7 64位5. 在虚拟机名称输入(虚拟机名) --> 选择…

一条 SQL 更新语句如何执行的

Server 层 存储引擎层 总流程 查询语句 连接器 查询缓存 分析器 优化器 执行器 更新语句 redo log&#xff08;节省的是随机写磁盘的 IO 消耗&#xff08;转成顺序写&#x…

windows达梦安装

1.首先准备好windows安装系统&#xff0c;准备工作的做好&#xff0c;然后把素材包dm8_20230418_x86_win_64放进去&#xff0c;进行解压 解压完成之后&#xff0c;把dm8_20230418_x86_win_64再次进行解压&#xff0c;然后点击安装setup进行安装 然后点击接受进行下一步&#xf…

网络安全msf学习1

工具&#xff1a;netcat 用途 &#xff1a;端口连接、数据提交 工具nmap 用途&#xff1a;端口扫描、服务识别、操作系统指纹识别 工具 httprint 用途&#xff1a;通过远程http指纹判断http服务类型 工具&#xff1a; tamper ie 用途&#xff1a; http数据包修改、转发工…

直方图及数据95%置信区间及特征筛选

rm(list ls()) library(Rmisc) library(ggplot2) library(dplyr)data <- iris x<-iris$Sepal.Length #求置信区间方法1## confidence_interval <- t.test(x)$conf.int print(confidence_interval) #[1] 5.709732 5.976934 #attr(,"conf.level") #[1] 0.95#…

翻转时钟效果

时分秒三个部分结构功能完全一致&#xff0c;均有四块构成&#xff0c;上下各两块。 正面可见&#xff0c;背面不可见&#xff0c;同时需要调整翻转过程中的z-index。 初始状态card2为已经翻转状态。 calendar.html <!DOCTYPE html> <html lang"en">&…

Excel第26享:模糊查找之Hlookup函数与通配符的嵌套

1、需求描述 如下图所示&#xff0c;现第一行有三个参考值&#xff1a;人S、羊E、猪3&#xff0c;在第三行有5个字&#xff1a;马、牛、人、羊、猪&#xff0c;每个字如果出现在第一行的三个参考值中&#xff0c;就返回该单元格的数值。如&#xff0c;人&#xff0c;就返回“人…