当前位置: 首页 > news >正文

Java_多线程

在这里插入图片描述

并发和并行

并发

在同一时刻,有多个指令在单个CPU上交替执行

并行

在同一时刻,有多个指令在多个CPU上同时执行

多线程的实现方式

继承Thread类的方式

在这里插入图片描述
注意给线程设置名字,启动线程等操作
在这里插入图片描述

实现Runable的方式

自己创建一个类然后去实现Runable接口,重写run方法;

为什么会有这个方式?

因为Java只支持单继承,如果已经继承一个类了,那么就不能继承第二个类,所以有局限性。
在这里插入图片描述
创建一个Thread对象的时候传入创建的的重写类,start()开启线程
在这里插入图片描述

问题

在使用自己实现的Runable接口的类的时候,不能直接使用Thread类中的方法,可以通过Thread.currentThread()获得当前执行run()函数的线程。
在这里插入图片描述

利用Callable接口和Future接口方式

为什么要实现Callable接口?因为之前使用的多线程的函数中并没有返回值。
1、定义的类实现Callable接口,并重写call()方法,Callable中的泛型为返回值的类型
2、创建Future类,它是一个抽象类所以应该创建它的子类FutureTask类来管理结果;创建的时候传入实现Callable接口的对象。
3、创建Thread类的时候传入FutureTask的对象
4、执行Thread类中的start()方法
4、最后通过FutureTask对象获得结果
在这里插入图片描述
在这里插入图片描述

多线程中常用的成员方法

在这里插入图片描述

线程优先级

对于抢占式的线程,具有优先级。Java中优先级为1-10,创建一个线程默认为5;
优先级越高,在CPU上执行的概率越高。

守护线程

当其他非守护线程执行完毕之后,守护线程会陆续结束;
换个说法就是,正常线程执行完毕了,守护线程就没有存在的必要了

定义一个非守护线程

在这里插入图片描述

定义一个守护线程

在这里插入图片描述

创建对象,并设置守护线程

在这里插入图片描述
结果:非守护线程结束之后,守护线程也结束了(并不是马上,存在一定的延迟)
在这里插入图片描述

为什么会有守护线程

当把聊天窗关闭之后,传输文件的线程就没有存在的必要了。
在这里插入图片描述

礼让线程

在这里插入图片描述
Thread.yield()为线程抢到CPU执行权之后,让出使用权。重新抢线程。
仅仅会使两个线程执行的更加均匀,并不是绝对均匀,因为还要抢。

插入线程(了解)

有两个线程A和B,B的线程中获得A线程的对象,并且A线程的对象调用join()函数,代表将A线程插入到当前B线程之前;所以A执行完毕之后B才执行。
在这里插入图片描述
在这里插入图片描述

线程的生命周期

在这里插入图片描述

线程的安全问题

就是3个线程卖票,然后出现卖重复和多余的票的问题。没啥好解释的。

同步代码块

为了保证操作的唯一性,解决上面线程的安全问题所提出来的

synchronized(锁对象){}
这里锁对象可以理解为之前的flag标记,只不过注意是唯一的就行

在这里插入图片描述

改进

字节码对象可以使用当前类的字节码文件对象
在这里插入图片描述

同步方法

如果是想锁住 一整个方法,那么使用同步方法;也就是将synchronized加到方法上,
1、同步方法是锁住方法里面所有的代码
2、锁住的对象不能像上面同步代码块那样能够自己指定;对于非静态的方法中,锁住的对象为this;对于静态的方法为当前类的字节码文件对象
3、技巧:对于那些不知道什么东西应该放到同步方法中的问题,可以先写同步代码块,然后将同步代码块放到同步方法中。
在这里插入图片描述

使用实现Runable的接口的方式进行展示

注意的点

这里面有一个要注意的地方就是,之前使用类去继承Thread类的时候,里面的ticket是static的;
但是如果是实现Runable接口,那么ticket就不用定义为static;
因为如果继承Thread的话,我们创建几个线程就创建几个Thread,所以里面的ticket为static;
我们如果实现Runable的话,我们是创建几个Thread的时候输入实现Runable的对象,所以不用为static;
在这里插入图片描述
在这里插入图片描述
把他改成同步方法的形式
在这里插入图片描述

lock锁

在这里插入图片描述
之前的就是很省事,这个lock就是很繁琐,像是原本OS中精细化上锁,解锁。还要考虑其他进程等待其他进程解锁的逻辑
下面这个函数,会发生即使票卖出100个,但是程序还是不会停止;因为在100处直接break了,没有进行解锁的操作;导致其他线程一直等待锁
在这里插入图片描述
因此改成try catch finally的形式,在finally中执行释放锁的操作:
在这里插入图片描述

死锁

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

生产者消费者(等待唤醒机制)

就是那个一个桌子,一个生产者一个消费者的情形。
在这里插入图片描述

生产者

package com.waitandnotify;public class Cook extends Thread{@Overridepublic void run() {synchronized (Desk.lock){while (true){if(Desk.count == 10){break;}if(Desk.flag == 0){Desk.flag = 1;Desk.lock.notifyAll();System.out.println("做了第"+Desk.count+"份");}else {try {Desk.lock.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}}}}
}

消费者

package com.waitandnotify;public class Foodie extends Thread{@Overridepublic void run() {synchronized (Desk.lock){while(true){if(Desk.flag == 1){System.out.println("正在吃:"+Desk.count);Desk.count++;Desk.flag = 0;//唤醒进程Desk.lock.notifyAll();}else {try {Desk.lock.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}if(Desk.count == 10){break;}}}}
}

测试类

package com.waitandnotify;public class Demo {public static void main(String[] args) {Cook cook = new Cook();Foodie foodie = new Foodie();cook.start();foodie.start();}
}

等待唤醒机制(阻塞队列实现)

在这里插入图片描述

阻塞队列的继承结构

放的进程没有空间的时候会阻塞,取的进程没有空间的时候会阻塞;这就是通道啊。
在这里插入图片描述
ArrayBlockingQueue底层是数组,所以在创建的时候要指定大小。

创建阻塞队列

在这里插入图片描述

实现生产者

注意阻塞队列都是一个,所以定义一个成员变量;
注意,queue.put()个queue.take()中才是线程同步的代码;run函数中其他部分不是同步的代码;
所以输出的地方会出现重复的东西。
在这里插入图片描述

消费者

在这里插入图片描述

线程的状态

在这里插入图片描述

线程池

为什么会有线程池?
例子:吃饭,A吃饭要买碗,吃完就把碗摔了;线程创建和消除也是这样,很费资源。
在这里插入图片描述

在这里插入图片描述

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

自定义线程池

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

核心线程,一直存在;临时线程为当等待的任务占满了队伍,并且有新的任务的时候创建临时进程;其中定义了临时的时间,如果超过定义的临时时间没有使用临时进程,那么临时进程就销毁。如果提交的任务数量超过核心线程数量+临时线程+队伍长度;触发任务拒绝策略。
在这里插入图片描述

任务拒绝策略

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

在这里插入图片描述

多线程额外扩展

看阿伟的文件,不过找不到,直接看八股文吧。

相关文章:

Java_多线程

并发和并行 并发 在同一时刻,有多个指令在单个CPU上交替执行 并行 在同一时刻,有多个指令在多个CPU上同时执行 多线程的实现方式 继承Thread类的方式 注意给线程设置名字,启动线程等操作 实现Runable的方式 自己创建一个类然后去实现…...

uniapp开发h5部署到服务器

1.发行>网站-PC Web或手机H5(仅适用于uniapp) 2.填写网站域名 3.编译成功后会生成一个unpackage文件夹找到下面的h5 4.接下来会使用一个工具把h5里面的文件放到服务器上面(WinSCP使用其他能部署的工具也行) 5.登录 6.登录成功后…...

如何在个人电脑本地化部署Deepseek-R1大模型

文章目录 Deepseek概述公司简介DeepSeek模型优势DeepSeek模型发展历史Ollama安装Deepseek版本选择Deepseek支持的客户端工具编程语言客户端库桌面客户端插件类其他工具客户端工具配置cherryStudio配置测试如何使用DeepSeek满血版什么是 DeepSeek R1 满血版?deepseek官方第三方…...

Java中关于JSON的基本使用

Java中关于JSON的基本使用 Java中可以操作json的类库jar有很多,网上一找一大片,每种封装的jar包有自己的方法,需要查阅资料使用,但无非就是json转对象,对象转json这些 Java中常见的json类jar包:Gson,Jackso…...

简化的动态稀疏视觉Transformer的PyTorch代码

存一串代码(简化的动态稀疏视觉Transformer的PyTorch代码) import torch import torch.nn as nn import torch.nn.functional as F class DynamicSparseAttention(nn.Module): def __init__(self, dim, num_heads8, dropout0.1): super().__init__()…...

PADS多层板减少层数

前提 PADS是硬件工程师必备的画图软件,相信很多朋友遇到过为降低成本把6层板改为4层,或8层改为6层的经历,正常是把不需要的两层上所有东西删掉,然后修改层设置,下面举例说明。 首先是将要删除的层上的数据全部删除&a…...

你需要提供管理员权限才能删除此文件夹解决方法

立即高级启动 windows10 搜索“设置”,然后“更新和安全””->“恢复”->“立即重新启动” windows11 搜索“设置”,然后“Windows更新”->“更新历史记录”->“恢复”->“立即重新启动” 疑难解答 点击“疑难解答” 高级选项 启…...

螺旋折线(蓝桥杯18G)

、 #include<iostream> using namespace std; typedef pair<int,int> Dot;//存储坐标 int dy[] { 0,1,0,-1 }; int dx[] { -1,0,1,0 }; int main() {int direction 0,x,y,dis 0;Dot pos make_pair(0,0);cin >> x >> y;for (int i 1;; i) {for (…...

常见的数据仓库有哪些?

数据仓库(Data Warehouse,简称数仓)是企业用于存储、管理和分析大量数据的重要工具,其核心目标是通过整合和处理数据,为决策提供高质量、一致性和可信度的数据支持。在构建和使用数仓时,选择合适的工具和技术至关重要。以下是常见的数仓工具及其特点的详细介绍: 1. Hiv…...

数据科学之数据管理|NumPy数据管

一、Numpy介绍 (一) 什么是numpy NumPy是Python中科学计算的基础包。它是一个Python库,提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,有包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运…...

LSTM 学习笔记 之pytorch调包每个参数的解释

0、 LSTM 原理 整理优秀的文章 LSTM入门例子&#xff1a;根据前9年的数据预测后3年的客流&#xff08;PyTorch实现&#xff09; [干货]深入浅出LSTM及其Python代码实现 整理视频 李毅宏手撕LSTM [双语字幕]吴恩达深度学习deeplearning.ai 1 Pytorch 代码 这里直接调用了nn.l…...

ASUS/华硕飞行堡垒9 FX506H FX706H 原厂Win10系统 工厂文件 带ASUS Recovery恢复

华硕工厂文件恢复系统 &#xff0c;安装结束后带隐藏分区&#xff0c;带一键恢复&#xff0c;以及机器所有的驱动和软件。 支持型号&#xff1a;FX506HC, FX506HE, FX506HM, FX706HC, FX706HE, FX706HM, FX506HHR, FX706HMB, FX706HEB, FX706HCB, FX506HMB, FX506HEB, FX506HC…...

Unity使用iTextSharp导出PDF-04图形

坐标系 pdf文档页面的原点&#xff08;0&#xff0c;0&#xff09;在左下角&#xff0c;向上为y,向右为x。 文档的PageSize可获取页面的宽高数值 单位&#xff1a;像素 绘制矢量图形 使用PdfContentByte类进行绘制&#xff0c;注意文档打开后才有此对象的实例。 绘制方法 …...

JDBC如何连接数据库

首先&#xff0c;我们要去下载JDBC的驱动程序 官网下载地址:https://downloads.mysql.com/archives/c-j/ 选择最新版本就可以 然后回到我们idea点击file - project Structure - Modules&#xff0c; 就行了 参考1&#xff1a;如何解决JDBC连接数据库出现问题且对进行数据库操…...

Unity URP的2D光照简介

官网工程&#xff0c;包括2d光照&#xff0c;动画&#xff0c;动效介绍&#xff1a; https://unity.com/cn/blog/games/happy-harvest-demo-latest-2d-techniques https://docs.unity3d.com/6000.0/Documentation/Manual/urp/Lights-2D-intro.html 人物脸部光照细节和脚上的阴影…...

【IC】AI处理器核心--第二部分 用于处理 DNN 的硬件设计

第 II 部分 用于处理 DNN 的硬件设计 第 3 章 关键指标和设计目标 在过去的几年里&#xff0c;对 DNN 的高效处理进行了大量研究。因此&#xff0c;讨论在比较和评估不同设计和拟议技术的优缺点时应考虑的关键指标非常重要&#xff0c;这些指标应纳入设计考虑中。虽然效率通常…...

从 0 开始本地部署 DeepSeek:详细步骤 + 避坑指南 + 构建可视化(安装在D盘)

个人主页&#xff1a;chian-ocean 前言&#xff1a; 随着人工智能技术的迅速发展&#xff0c;大语言模型在各个行业中得到了广泛应用。DeepSeek 作为一个新兴的 AI 公司&#xff0c;凭借其高效的 AI 模型和开源的优势&#xff0c;吸引了越来越多的开发者和企业关注。为了更好地…...

如何本地部署DeepSeek集成Word办公软件

目录 本地部署DeepSeek安装Ollama下载并部署DeepSeek模型安装ChatBox客户端&#xff08;可选&#xff09; 将DeepSeek集成到Word修改Word中的VBA代码执行操作 ✍️相关问答如何在Word中安装和使用VBA宏DeepSeek模型有哪些常见的API接口&#xff1f;如何优化DeepSeek在Word中的集…...

Centos10 Stream 基础配置

NetworkManger 安装 dnf install NetworkManager 查看网络配置 nmcli [rootCentos-S-10 /]# nmcli ens33&#xff1a;已连接 到 ens33"Intel 82545EM"ethernet (e1000), 00:0C:29:08:3E:71, 硬件, mtu 1500ip4 默认inet4 192.168.31.70/24route4 default …...

时间序列分析(三)——白噪声检验

此前篇章&#xff1a; 时间序列分析&#xff08;一&#xff09;——基础概念篇 时间序列分析&#xff08;二&#xff09;——平稳性检验 一、相关知识点 白噪声的定义&#xff1a;白噪声序列是一种在统计学和信号处理中常见的随机过程&#xff0c;由一系列相互独立、具有相同…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...