JavaEE 08 线程池简介

前言

前面我们谈完了定时器,单例模式,阻塞队列等的操作并且做了模拟实现,今天我们再来说一说线程池的操作以及一些锁策略.

注:本章几乎均为理论篇,实践较少.

下面就让我们开始吧.

线程池

我们知道因为进程的频繁创建和销毁,带来的开销过大,我们无法接受,所以我们引入了更轻量级的线程,但是其实这里的线程频繁消耗的话,带来的开销也是我们无法接受的,所以我们又想了两个方案,线程池方案或者是更加轻量级的协程/纤程 

纤程本质上是靠程序员在用户态进行调度,不是靠内核的调度器来操作,这节省了很多的开销

举个例子,如果一个进程中开一千个线程,电脑就卡死了,但是开一千个协程,其实是轻轻松松的

线程池的应用来说就是把线程提前创建好,用完了不要着急销毁,放进线程池里,以备下次使用,在这个过程中并没有频繁的创建和销毁线程,所以相对来说开销就小得多了,只是从线程池中取线程来使用,用完了还给线程池即可

tips:内核态和用户态之间的交互可以理解为,你去银行办事情,工作人员让你去去整一个身份证复印件,你可以让他帮你整,或者去自己整,他帮你整的话你无法掌控他什么时候帮你整,但是你自己整的话就能确定自己的时间安排

JVM提供的线程池(了解参数即可)

这里我们只要了解最后一个线程池的参数即可,因为几个方法的参数是重复的,最后一个的参数是最全的.

corePoolSize: 核心线程数           一个线程池里,最少有多少个线程

maximumPoolSize :最大线程数    一个线程池中,最多有多少个线程

keepAliveTime:线程空闲超过这个时间阈值,就会被销毁

unit:                 时间单位,取分钟,秒,小时等等

workQueue:    和定时器一样,线程池也可以有很多任务,也可以设置为带有优先级的

threadFactory:  线程工厂,本质上是给new这个操作封装了一层,可能同名同参数的构造方法,这样构成不了重载,我们就想弥补一下这个缺陷,封装一层构造方法.

handler:拒绝策略(最重要的)

以下是四个Java标准库中提供的拒绝策略

解决的是在阻塞队列满了之后,你还想往里面添加任务,我们以何种方式拒绝

第一种:直接不干了,旧任务和新任务都不干了,直接抛一个异常

第二种:新的任务,由添加任务的线程自己执行

第三种:丢弃一个最老的任务来执行这个任务

第四种:直接丢弃最新的任务

.

但是这个类使用起来还是比较复杂的,所以标准库还提供了另一个版本来简化操作,Exectors

都是通过submit添加任务,只不过是构造方法有所差异

所以如果你想实现高度定制化的线程池就使用上面这个很多参数的,不然就可以使用Exectors即可

注:一个线程池中有多少线程不是根据网上说的cpu核心数-1等等这么简单,其实还是有很多细节之处的,需要我们通过测试来决定,因为有些线程是IO密集型,有些是cpu密集型的,根据情况而定

线程池的简单实现

使用一个列表来存放队列,使用一个阻塞队列来存放任务,其中只有一个submit方法来新建任务

class MyThreadPool{private List<Thread> threadList = new ArrayList<>();private BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1000);public MyThreadPool(int n){for (int i = 0; i < n; i++) {Thread t = new Thread(()->{//TODOwhile(true){try {//队列为空则会阻塞Runnable runnable = queue.take();//取出任务直接执行就行runnable.run();} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();threadList.add(t);}}public void submit(Runnable runnable) throws InterruptedException {queue.put(runnable);}
}

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

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

相关文章

[架构之路-261]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 架构设计 - 网络数据交换格式

一、网络数据交换格式 1.1 什么是网络数据交换格式 网络数据交换格式指的是在计算机网络中传输和存储数据时所采用的特定格式。 它定义了数据的组织方式、结构和编码规则&#xff0c;以便不同系统和应用程序之间能够准确地解析和处理数据。 网络数据交换格式的主要目的是&a…

DIP——边缘提取与分割

1.使用canny算法进行边缘提取 本实验比较简单&#xff0c;基本思路是对原图像进行一个高斯模糊处理&#xff0c;用于去噪&#xff0c;之后转换为灰度图&#xff0c;直接调用cv库中的canny记性边缘提取。若想直接得到彩色边缘&#xff0c;则通过按位与操作&#xff0c;将原始彩色…

人工智能原理复习--机器学习

文章目录 上一篇机器学习概述归纳(示例)学习ID3决策树算法K近邻算法下一篇 上一篇 人工智能原理复习–搜索策略&#xff08;二&#xff09; 机器学习概述 学习系统的基本结构&#xff1a; #mermaid-svg-JMjIZHjVOirLolvu {font-family:"trebuchet ms",verdana,ari…

CV计算机视觉每日开源代码Paper with code速览-2023.12.5

点击计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构&#xff1a;Transformer】GIFT: Generative Interpretable Fine-Tuning Transformers 论文地址&#xff1a;https://arxiv.org…

pytorch中的归一化:BatchNorm、LayerNorm 和 GroupNorm

1 归一化概述 训练深度神经网络是一项具有挑战性的任务。 多年来&#xff0c;研究人员提出了不同的方法来加速和稳定学习过程。 归一化是一种被证明在这方面非常有效的技术。 1.1 为什么要归一化 数据的归一化操作是数据处理的一项基础性工作&#xff0c;在一些实际问题中&am…

【参天引擎】华为参天引擎内核架构专栏开始更新了,多主分布式数据库的特点,类oracle RAC国产数据开始出现了

cantian引擎的介绍 ​专栏内容&#xff1a; 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构&#xff0c;以及如何实现多机的数据库节点的多读多写&#xff0c;与传统主备&#xff0c;MPP的区别&#xff0c;技术难点的分析&#xff0c;数据元数据同步&#xff0c;多主节点的…

Html转PDF,前端JS实现Html页面导出PDF(html2canvas+jspdf)

Html转PDF&#xff0c;前端JS实现Html页面导出PDF&#xff08;html2canvasjspdf&#xff09; 文章目录 Html转PDF&#xff0c;前端JS实现Html页面导出PDF&#xff08;html2canvasjspdf&#xff09;一、背景介绍二、疑问三、所使用技术html2canvasjspdf 四、展示开始1、效果展示…

【基于Flask、MySQL和Echarts的热门游戏数据可视化平台设计与实现】

基于Flask、MySQL和Echarts的热门游戏数据可视化平台设计与实现 前言数据获取与清洗数据集数据获取数据清洗 数据分析与可视化数据分析功能可视化功能 创新点结语 前言 随着游戏产业的蓬勃发展&#xff0c;了解游戏销售数据对于游戏从业者和游戏爱好者都至关重要。为了更好地分…

FFmpeg抽取视频h264数据重定向

根据视频重定向技术解析中的 截获解码视频流的思路&#xff0c;首先需要解决如何输出视频码流的问题。 目前只针对h264码流进行获取&#xff0c;步骤如下&#xff1a; 打开mp4文件并创建一个空文件用于存储H264数据 提取一路视频流资源 循环读取流中所有的包(AVPacket),为…

西南科技大学数字电子技术实验三(MSI逻辑器件设计组合逻辑电路及FPGA的实现)FPGA部分

一、实验目的 进一步掌握MIS(中规模集成电路)设计方法。通过用MIS译码器、数据选择器实现电路功能,熟悉它们的应用。进一步学习如何记录实验中遇到的问题及解决方法。二、实验原理 1、4位奇偶校验器 Y=S7i=0DiMi D0=D3=D5=D6=D D1=D2=D4=D7= `D 2、组合逻辑电路 F=A`B C …

【亲测有效】支持横竖屏 微信小程序video禁止进度条拖动,微信小程序遮罩进度条,

背景&#xff1a;部分课程禁止客户拖动视频进度条直至播放结束 红色是遮罩区域遮罩区域 实际遮罩效果&#xff08;有一个很浅的阴影区域&#xff09; 实现代码 .wxml文件 <video enable-progress-gesture"false" ><cover-view class"cover">…

hdlbits系列verilog解答(mt2015_q4)-54

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 本次使用系列文章52和53中实现的子模块,实现以下组合逻辑电路。 二、verilog源码 module top_module (input x, input y, output z);wire [3:0