线程池的原理和基本使用~

线程池的基本原理:

无论是之前在JavaSE基础中,我们学习过的常量池,还是在操作数据库时,我们学习过数据库连接池,以及接下来要学习的线程池,均是一种池化思想,其目的就是为了提高资源的利用率,线程池顾名思义就是对线程对象的一种优化,如果不使用线程池,那么我们对线程的操作即为手动创建线程对象执行任务任务执行完毕释放线程对象,映射到我们生活为我们每次打电话都需要买一个手机,每次打完电话就将手机扔掉,那么这样一来,无疑是非常的铺张浪费,而线程池就类似于将手机重复利用而不是每次都换新的,它能很好地提高资源的利用率并且由于线程对象是提前创建好的,因此也能够提高程序的响应速度

下面我使用日常生活中最常见的一个例子来说明线程池的原理

我们可以将海底捞作为一个线程池,那么海底捞中的桌子可以看作是线程对象,假设当前店中已经有3张空闲的桌子可以使用,此时来了4组可以需要吃饭,那么服务员会根据先后顺序先安排前3组客人进行就餐,剩下的一组客人需要进入等待区,随后来的客人都会进入等待区,但是等待区的位置也不是无穷无尽的啊,假设我们的等待区只能最多让2个用户进行等待,当前如果又来了一个客人,那么就会出现他们既没有空闲的餐桌供他们使用,等待区也没有空闲的位置,那么此时由于客人并发量太大了,海底捞的老板就会触发一种应急方案,就是在当前餐厅空旷的区域加桌子,那么等待区中的第一位客人就可以从等待区中出来了呀,刚刚没有办法处理的客人此时就可以加入等待区中,加桌子是挺好的,但是也不能无限加啊,因为餐厅可使用的地方是有限的,当达到最大值后,又来了一位客人,那么服务员只好拒绝接待该客人!

使用Java简单模拟实现线程池:

package org.example;import java.util.concurrent.*;public class Main {public static void main(String[] args) {//3-->表示核心的线程对象数量,也就是上述海底捞例子中没加桌子前的餐厅桌子数量//5-->表示最大线程对象的数量,也就是上述海底捞例子中该餐厅最多可容纳的桌子数量//1和后面的TimeUnit.SECONDS表示1秒钟没有任务,就可以停止工作了//ArrayBlockingQueue-->表示一个等待队列//defaultThreadFactory-->调用默认的工厂//AbortPolicy拒绝策略//ExecutorService是Java提供的线程池ExecutorService executorService=new ThreadPoolExecutor(3,5,1L, TimeUnit.SECONDS,new ArrayBlockingQueue<>(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());for (int i=0;i<9;i++){executorService.execute(()->{System.out.println(Thread.currentThread().getName()+"办理业务");});}executorService.shutdown();}
}

输出如下所示:

当前线程池最多可容纳线程的数量为8,那么到第九个线程就会触发拒绝策略

pool-1-thread-1办理业务
pool-1-thread-5办理业务
pool-1-thread-4办理业务
pool-1-thread-3办理业务
pool-1-thread-2办理业务
pool-1-thread-4办理业务
pool-1-thread-1办理业务
pool-1-thread-5办理业务
Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task org.example.Main$$Lambda$1/1283928880@682a0b20 rejected from java.util.concurrent.ThreadPoolExecutor@3d075dc0[Running, pool size = 5, active threads = 5, queued tasks = 3, completed tasks = 0]at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)at org.example.Main.main(Main.java:15)

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

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

相关文章

mysql 链接超时的几个参数详解

mysql5.7版本中&#xff0c;先查看超时设置参数&#xff0c;我们这里只关注需要的超时参数&#xff0c;并不是全都讲解 show variables like %timeout%; connect_timeout 指的是连接过程中握手的超时时间,在5.0.52以后默认为10秒&#xff0c;之前版本默认是5秒&#xff0c;主…

【vscode写vue代码是白色怎么办】

【vscode写vue代码是白色怎么办】 在插件列表中搜索Vetur 安装即可

Web学习路线

阅读前请看一下&#xff1a;我是一个热衷于记录的人&#xff0c;每次写博客会反复研读&#xff0c;尽量不断提升博客质量。文章设置为仅粉丝可见&#xff0c;是因为写博客确实花了不少精力。希望互相进步谢谢&#xff01;&#xff01; 文章目录 阅读前请看一下&#xff1a;我是…

Redis 命令全解析之 Hash类型

文章目录 ⛄介绍⛄命令⛄RedisTemplate API⛄应用场景 ⛄介绍 Hash类型&#xff0c;也叫散列&#xff0c;其value是一个无序字典&#xff0c;类似于Java中的 HashMap 结构。 String结构是将对象序列化为JSON字符串后存储&#xff0c;当需要修改对象某个字段时很不方便&#xf…

降维技术——PCA、LCA 和 SVD

一、说明 降维在数据分析和机器学习中发挥着关键作用&#xff0c;为高维数据集带来的挑战提供了战略解决方案。随着数据集规模和复杂性的增长&#xff0c;特征或维度的数量通常变得难以处理&#xff0c;导致计算需求增加、潜在的过度拟合和模型可解释性降低。降维技术通过捕获数…

用队列实现栈

问题描述&#xff1a; 请你仅用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通队列的全部四种操作&#xff08;push、top、pop和empty&#xff09;。 实现MyStack类&#xff1a; void push(int x) 将元素x压入栈顶。int pop()移除并返回栈顶…

java中线程的状态是如何转换的?

在 Java 中&#xff0c;线程有几种状态&#xff0c;主要包括 NEW&#xff08;新建&#xff09;、RUNNABLE&#xff08;可运行&#xff09;、BLOCKED&#xff08;阻塞&#xff09;、WAITING&#xff08;等待&#xff09;、TIMED_WAITING&#xff08;计时等待&#xff09;、和 TE…

Vue学习笔记-Vue3中的计算属性与监视属性

computed函数 import {reactive,computed} from vue export default {name: "DemoVue",setup(){//数据定义let person reactive({firstName : 李,lastName : 四,age:18,})//计算属性定义-简写形式person.fullName computed(()>{return person.firstName-person…

手写 Promise:深入理解异步编程的基石

手写 Promise&#xff1a;深入理解异步编程的基石 本文将带您逐步实现一个简单的 Promise&#xff0c;以帮助您深入理解异步编程的基本概念。通过自己动手编写 Promise 的过程&#xff0c;您将更好地理解 Promise 的工作原理和常见用法&#xff0c;并能够应用于实际项目中。 …

什么是网站劫持

网站劫持是一种网络安全威胁&#xff0c;它通过非法访问或篡改网站的内容来获取机密信息或者破坏计算机系统。如果您遇到了网站劫持问题&#xff0c;建议您立即联系相关的安全机构或者技术支持团队&#xff0c;以获得更专业的帮助和解决方案。

探索 HTTPS:保障网络通信的安全性

引言 HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是一种安全的通信协议&#xff0c;用于在网络上安全地传输数据。它是基于 HTTP 协议的扩展&#xff0c;通过加密通信实现了数据的保护和安全性。 功能介绍 加密数据传输&#xff1a; 使用加密技术对数…

Prism框架快速注册带有特性标签的类型

前言 最近用Prims框架,真的是懒得手动注册各种类型,不利于团队开发工作,各种dll强耦合,后期维护还麻烦,这次我们带来了一个快速注册的类来快速提高开发效率。重点用到的就是通过反射出dll里面的类型,然后根据特性或者类型过滤来完成快速注册的功能。 代码 using Prism…

Angular 进阶之四:SSR 应用场景与局限

应用场景 内容丰富&#xff0c;复杂交互的动态网页&#xff0c;对首屏加载有要求的项目&#xff0c;对 seo 有要求的项目&#xff08;因为服务端第一次渲染的时候&#xff0c;已经把关键字和标题渲染到响应的 html 中了&#xff0c;爬虫能够抓取到此静态内容&#xff0c;因此更…

【面试专题】MySQL篇①

1.MySQL中&#xff0c;如何定位慢查询? ①介绍一下当时产生问题的场景&#xff08;我们当时的一个接口测试的时候非常的慢&#xff0c;压测的结果大概5秒钟&#xff09; ②我们系统中当时采用了运维工具&#xff08; Skywalking &#xff09;&#xff0c;可以监测出哪个接口…

PostgreSQL从小白到高手教程 - 第38讲:数据库备份

PostgreSQL从小白到专家&#xff0c;是从入门逐渐能力提升的一个系列教程&#xff0c;内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容&#xff0c;希望对热爱PG、学习PG的同学们有帮助&#xff0c;欢迎持续关注CUUG PG技术大讲堂。 第38讲&#…

running小程序重要技术流程文档

一、项目文件说明&#xff1a; &#xff08;注&#xff1a;getMyMoney无用已删除&#xff09; 二、重要文件介绍 1.reinfo.js&#xff1a;位于utils文件下&#xff0c;该文件封装有统一的请求URL&#xff0c;和请求API同意封装供页面调用&#xff1b;调用时候需要在页面上先…

【C语言】操作符详解(一):进制转换,原码,反码,补码

目录 操作符分类 2进制和进制转换 2进制转10进制 10进制转2进制 2进制转8进制和16进制 2进制转8进制 2进制转16进制 原码、反码、补码 操作符分类 操作符中有一些操作符和二进制有关系&#xff0c;我们先铺垫一下二进制的和进制转换的知识。 2进制和进制转换 其实我们经…

数据结构准备知识

struct&#xff08;结构体&#xff09; struct&#xff0c;或称为结构体&#xff0c;是C语言中一种复合数据类型&#xff0c;它允许你将多个不同类型的数据项组合成一个单一的单位。这对于创建记录或更复杂的数据结构非常有用。 结构体的定义语法如下&#xff1a; struct 结…

vertica主键列能插入重复值的处理办法

问题描述 开发同事反馈在vertica中创建含主键列的表中插入重复数据时没有进行校验&#xff0c;插入重复值成功。经过测试着实可以插入重复值&#xff0c;这个坑有些不一样。 创建表和插入语句如下&#xff1a; --创建表 CREATE TABLE dhhtest(ID VARCHAR(64) PRIMARY KEY );…

postgresql数据库配置主从并配置ssl加密

1、先将postgresql数据库主从配置好 参考&#xff1a;postgresql主从配置 2、在主节点配置ssl加密&#xff0c;使用navicat测试是否可以连接 参考&#xff1a;postgresql配置ssl 3、正常连接无误后&#xff0c;将root.crt、server.crt、server.key复制到从数据库节点的存储…