线程池的简单实现与应用

1.什么是线程池 

线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。

线程池最大的好处就是减少每次启动、销毁线程的损耗。

2.线程池参数介绍 

参数名称说明
corePoolSize正式员工的数量.(正式员工,一旦录用,永不辞退,干活的主力)
maximumPoolSize

正式员工+临时工的数目.(临时工:活多了,正式员工干不完,就招临时工干活,活不多的时候就裁掉)

也就是说核心线程不忙的时候,非核心线程就会被回收

keepAliveTime临时工允许的空闲时间
unitkeepaliveTime的时间单位,是秒,分钟,还是其他值.
workQueue传递任务的阻塞队列
threadFactory创建线程的工厂,参与具体的创建线程工作.通过不同线程工厂创建出的线程相当于对⼀些属性进⾏了不同的初始化设置
RejectedExecutionHandler拒绝策略,如果任务量超出公司的负荷了接下来怎么处理.

 RejectedExecutionHandler

  • AbortPolicy():超过负荷,直接抛出异常.(让程序员知道任务太多了,处理不过来,代码罢工)
  • CallerRunsPolicy():调用者负责处理多出来的任务.(线程池满了,多出来的任务自己处理)
  • DiscardOldestPolicy():丢弃队列中最老的任务.(这样新的任务可以排进队列里)
  • DiscardPolicy():丢弃新来的任务,按照原有的节奏进行
     

 3.使用Executors 创建常见的线程池

 Executors创建线程池的几种方式:

  • newFixedThreadPool:创建固定线程数的线程池
  • newCachedThreadPool:创建线程数目动态增⻓的线程池.
  • newSingleThreadExecutor:创建只包含单个线程的线程池.
  • newScheduledThreadPool:设定延迟时间后执行命令,或者定期执行命令.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Demo34 {public static void main(String[] args) {//                能够根据任务的数目, 自动进行线程扩容.
//                Executors.newCachedThreadPool();
//                创建固定线程数目的线程池.
//                Executors.newFixedThreadPool(10);
//                创建一个只包含单个线程的线程池.
//                Executors.newSingleThreadExecutor();
//                创建一个固定线程个数, 但是任务延时执行的线程池.
//                Executors.newScheduledThreadPool(10);// 创建固定线程数目的线程池.//ExecutorService service = Executors.newFixedThreadPool(10);// 能够根据任务的数目, 自动进行线程扩容.//ExecutorService service=Executors.newCachedThreadPool();//创建一个只包含单个线程的线程池.//ExecutorService service=Executors.newSingleThreadExecutor();//创建一个固定线程个数, 但是任务延时执行的线程池.ExecutorService service=Executors.newScheduledThreadPool(10);for (int i = 0; i < 1000; i++) {int id = i;service.submit(new Runnable() {@Overridepublic void run() {System.out.println("tjctsl" + id + ", " + Thread.currentThread().getName());}});}}
}

 4.实现一个简单的线程池 


import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;class MyThreadPool {private BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1000);private int maxPoolSize = 0;private List<Thread> threadList = new ArrayList<>();// 初始化线程池 (FixedThreadPool)public MyThreadPool(int corePoolSize, int maxPoolSize) {this.maxPoolSize = maxPoolSize;// 创建若干个线程for (int i = 0; i < corePoolSize; i++) {Thread t = new Thread(() -> {try {while (true) {Runnable runnable = queue.take();runnable.run();}} catch (InterruptedException e) {e.printStackTrace();}});t.start();threadList.add(t);}}// 把任务添加到线程池中public void submit(Runnable runnable) throws InterruptedException {// 此处进行判定, 判定说当前任务队列的元素个数, 是否比较长.// 如果队列元素比较长, 说明已有的线程, 不太能处理过来了. 创建新的线程即可.// 如果队列不是很长, 没必要创建新的线程.queue.put(runnable);// 这里的 阈值 可以灵活调节if (queue.size() >= 500 && threadList.size() < maxPoolSize) {// 创建新的线程即可Thread t = new Thread(() -> {try {while (true) {Runnable task = queue.take();task.run();}} catch (InterruptedException e) {e.printStackTrace();}});t.start();}}
}public class Demo35 {public static void main(String[] args) throws InterruptedException {MyThreadPool threadPool = new MyThreadPool(10, 20);for (int i = 0; i < 10000; i++) {int id = i;threadPool.submit(new Runnable() {@Overridepublic void run() {System.out.println("hello " + id + ", " + Thread.currentThread().getName());}});}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录——填充每个节点的下一个右侧节点指针 II(Leetcode117)

题目链接 层序遍历 /* // Definition for a Node. class Node {public int val;public Node left;public Node right;public Node next;public Node() {}public Node(int _val) {val _val;}public Node(int _val, Node _left, Node _right, Node _next) {val _val;left _l…

21【Aseprite 作图】画白菜

1 对着参考图画轮廓 2 缩小尺寸 变成这样 3 本来是红色的描边&#xff0c;可以通过油漆桶工具&#xff08;取消 “连续”&#xff09;&#xff0c;就把红色的轮廓线&#xff0c;变成黑色的 同时用吸管工具&#xff0c;吸取绿色和白色&#xff0c;用油漆桶填充颜色 4 加上阴影…

svn批量解锁

问题 svn对文件进行checkout之后&#xff0c;先进行lock&#xff0c;之后再去更改&#xff0c;最后进行Commit操作&#xff1b; 上述为我们通过svn管理代码的正常方式&#xff0c;但总会有其他现象发生&#xff1b; 如果我们非正常操作&#xff0c;批量锁所有的svn文件&#x…

Django Celery 的配置及使用---最详细教程

Django Celery 的配置及使用 Redis提供队列消息功能 一、安装redis 系统版本&#xff1a;Ubuntu 20.041、获取最新软件包 sudo apt update sudo apt install redis-server2、安装完成后&#xff0c;Redis服务器会自动启动。查看redis是否启动成功 sudo systemctl status …

uniapp + vue3 设置 axios proxy 代理,并重写路径

uniapp vue2 设置代理如下&#xff1a; 已生成的项目架构里面找到manifest.json文件&#xff0c;通过源码视图的方式打开文件&#xff0c;在文件中添加一下代码即可完成代理&#xff1a; "h5": {"devServer": {"disableHostCheck": true, //禁…

Milvus的系统架构

简介 Milvus的构建在许多知名的向量搜索库比如Faiss, HNSW, DiskANN, SCANN等之上的&#xff0c;它针对稠密向量数据集的相似搜索而设计&#xff0c;能支持百万、十亿甚至万亿级别的向量搜索。 Milvus支持数据分片&#xff0c;流式数据插入&#xff0c;动态schema&#xff0c…

离散型制造行业智能工厂标准解决方案(49页 PPT)

方案介绍&#xff1a; 该解决方案的核心功能模块包括生产计划与排程、质量控制与追溯、设备管理与维护、物料管理与仓储以及供应链协同等。通过智能算法和数据分析&#xff0c;实现对生产过程的精准控制和优化。同时&#xff0c;智能工厂还支持远程监控和预测性维护&#xff0…

15.计算机网络

1.物理层的互联设备 中继器 和 集线器 2.集线器可以看做特殊的多路中继器 集线器 不可以做到自动寻址的功能 3.数据链路层 网桥 和 交换机 4.交换机是多端口网桥 5.网络层 路由器 6.应用层 网关 7.广播域 网络层 可以形成多个广播域 冲突域 网络层数据链路层 可以形成多个冲突域…

三大平台直播视频下载保存方法

终于解决了视频号下载的问题&#xff0c;2024年5月15日亲测可用。 而且免费。 教程第二部分&#xff0c;有本地电脑无法下载的解决方案。 第一部分&#xff1a;使用教程&#xff08;正常&#xff09; 第1步&#xff1a;下载安装包 下载迅雷网盘搜索&#xff1a;大海福利合集…

STM32时钟系统和时钟树

目录 STM32时钟系统 认识时钟树 什么是时钟 认识时钟树(F407) 配置系统时钟 系统时钟配置步骤 外设时钟使能和失能 sys_stm32_clock_init函数(F4) 时钟配置一般步骤 System文件夹_时钟系统工作原理 System文件夹介绍 Sys文件介绍 Delay文件介绍 Systic工作原理 S…

vue2人力资源项目9权限管理

页面搭建 <template><div class"container"><div class"app-container"><el-button size"mini" type"primary">添加权限</el-button><el-table-column label"名称" /><el-table-co…

基于Pytorch深度学习神经网络MNIST手写数字识别系统源码(带界面和手写画板)

第一步&#xff1a;准备数据 mnist开源数据集 第二步&#xff1a;搭建模型 我们这里搭建了一个LeNet5网络 参考代码如下&#xff1a; import torch from torch import nnclass Reshape(nn.Module):def forward(self, x):return x.view(-1, 1, 28, 28)class LeNet5(nn.Modul…

二.使用PgAdmin连接Postgresql

二.使用PgAdmin连接Postgresql PostgreSQL是一种开源的对象关系型数据库管理系统(ORDBMS),它支持大部分SQL标准并提供了许多高级功能,例如事务、外键、视图、触发器等。PostgreSQL由PostgreSQL全球开发组维护和开发,它是一种高度可扩展的数据库系统,可以在各种操作系统…

finallyshell激活-支持所有版本(老版 + 最新版) + 所有平台(mac + windows)

一&#xff1a;打开finally shell的激活页面 二&#xff1a;点击离线激活 三&#xff1a;复制机器码&#xff0c;然后执行一下代码 原文&#xff1a;大哥原文&#xff0c;但是这个大佬是用java实现的&#xff0c;执行因为依赖的问题一直报错 基于以上问题&#xff0c;所以使…

linux Docker在线/离线服务安装并支持centos7和centos8系统

注&#xff1a;以下内容都是经过测试;能在生产环境使用. 一、centos7版本的docker在线安装 1&#xff1a;运行以下命令&#xff0c;下载docker-ce的yum源。 sudo wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo…

Electron学习笔记(五)

文章目录 相关笔记笔记说明 七、系统1、系统对话框2、自定义窗口菜单3、系统右键菜单4、快捷键(1)、监听网页按键事件 &#xff08;窗口需处于激活状态&#xff09;(2)、监听全局按键事件 &#xff08;窗口无需处于激活状态&#xff09;(3)、补充&#xff1a;自定义窗口菜单快捷…

ModuleNotFoundError: No module named ‘sklearn‘

ModuleNotFoundError: No module named sklearn 解决办法&#xff1a; pip install scikit-learn

Qt---信号和槽

一、信号和槽机制 所谓信号槽&#xff0c;实际就是观察者模式。当某个事件发生之后&#xff0c;比如&#xff0c;按钮检测到自己被点击了一下&#xff0c;它就会发出一个信号&#xff08;signal&#xff09;。这种发出是没有目的的&#xff0c;类似广播。如果有对象对这个信号…

Python爬虫从入门到精通:一篇涵盖所有细节的高质量教程

目录 第一部分&#xff1a;Python爬虫基础 1.1 爬虫原理 1.2 Python爬虫常用库 1.3 爬虫实战案例 1.4 注意事项 第二部分&#xff1a;爬虫进阶技巧 2.1 处理动态加载的内容 2.2 登录认证 2.3 分布式爬取 2.4 反爬虫策略 第三部分&#xff1a;爬虫实战项目 3.1 豆瓣…

党务政务服务热线|基于SSM的党务政务服务热线平台(源码+数据库+文档)

目录 基于SprinBootvue的党务政务服务热线平台 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2后台功能模块 5.2.1管理员功能模块 5.2.2部门功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; …