JavaEE-初阶-多线程初阶

概念

 

 

第一个多线程程序 

可以通过查看jdk路径来找到jdk的控制

可以通过jconsole来查看线程。

创建线程

这是实现多线程的其中一种方法,继承Thread类,实现run方法,之后实例化继承了Thread类的MyThread方法,调用start方法,就会自动创建一个线程去执行run方法,如果直接调用run方法是不会创建新的线程的。

实现Runnable接口,也要实现run方法,但是和继承Thread类的不同,耦合度较低,在实例化Thread时将实例化继承了Runnable接口的对象传递,start执行的就是这个run方法

其他变形

多线程的优势-增加运行速度

Thread类以及常见方法

Thread的常见构造方法

Thread的常见属性

比较重要的就是判断后台线程和判断是否存活的方法。前台线程可以决定进程是否结束,只要还有一个前台线程运行,进程就不会终止,后台线程就算在运行,只要前台线程都结束了,进程还是要结束。

启动⼀个线程 - start()

终止线程

 

可以自定义一个变量,约定好在这个变量修改为约定值时,就终止线程。

Thread对象调用,该对象对应的线程终止。

在一些情况下,有要求,线程要有结束的先后顺序,那么就可以通过线程的对象,来等待线程,来做到线程的结束顺序变为可控。

获取当前线程引用

这是一个静态方法,可以直接通过类来调用,返回的时当前调用该方法的类对象的引用。

休眠线程

线程的状态

观察线程的所有状态

Waiting是

线程状态和转移的意义

 

多线程带来的的风险-线程安全 (重点)

观察线程不安全

线程安全的概念

线程不安全的原因

可见性

指令重排序

解决之前的线程不安全问题

synchronized 关键字 - 监视器锁 monitor lock

synchronized 的特性

不可重入的锁在加了一个锁之后,再次加同一把锁就会出现死锁,这种锁就是不可重入锁

而可重入锁在再次上锁的时候发现这个锁是自身持有的锁,那么就不会再加锁,而锁的释放时根据第一次上该锁的作用域来确定的。

synchronized 使用示例

这个锁可以是任意的对象,一个对象就可以视为是一个锁。

锁this对象和直接修饰普通方法是一样的。

死锁

Java 标准库中的线程安全类

volatile 关键字

volatile关键字可以将一些因为java优化所导致的可见性问题解决。

 

工作内存或寄存器和主内存

因为并不是所有的cpu都是直接优化在寄存器上的,所以直接说优化都是将数据存储在寄存器上方便读取不太合适,还有多级别的缓存,所以work memory更加合适。

wait 和 notify

wait()方法

notify()方法

notifyAll()方法

notifyAll虽然一次性唤醒了所有锁,但是这些锁还是需要重新竞争的。

wait和sleep的区别

多线程案例

单例模式

饿汉模式

懒汉模式(单线程)

懒汉模式-多线程版

懒汉模式-多线程版-改进

可能因为指令重排序导致还没有申请内存空间就将值赋给了instance,导致其他线程直接带着这个没有初始化的变量返回了。

解决方法实际上还是volatile

阻塞队列

一个线程给阻塞队列添加数据,一个线程消费数据。

生产数据,阻塞队列满了,就会阻塞,消费数据,阻塞队列为空就会阻塞。

这个判断语句最好选择while,本质上是为了二次验证数据是否满足要求,因为wait不仅仅能够被notify唤醒,也可能是设置的时间到了被唤醒,这种情况就需要对参数进行再次校验。

线程池

创建线程池的方法

参数代表的含义

工厂模式

工厂模式也是一种设计模式,主要应用再构造方法中,构造方法同名同参无法构成重载,因为构造方法要求是方法名与类名等同,而另外定义一个工厂类,提供构造对象的方法,就可以实现这些功能,而且可以根据不同的构造方法提供不同的参数。

因为原本的构造方法有些复杂

自主实现一个简易的线程池

定时器

第一个参数也就是实现了run方法的runnable接口的子类。

实现一个简易定时器

首先创建一个保存了执行方法和执行时间的类,并且要实现compareTo,因为需要加到优先级队列里面。

第二部要创建一个定时器类。

schedule传递的参数是一个runnable类和一个时间,代表多久之后执行方法,实例化一个保存了执行时间和方法的类对象。保存的时间是时间戳,获取系统当前时间并将多久之后执行加上,加入优先级队列,唤醒在locker锁之中阻塞的一个线程,让线程去执行任务。

这里需要注意的是锁的范围,这里将新创建的MyTimeTask对象也包括进去了,是否需要包括进去,看的是需求,如果算调用方法开始算时间就在锁外面,如果是锁里面开始算时间就包括在锁里面。

构造方法开始就要循环判断是否有任务需要执行。

但是之前的方法有缺陷,会导致cpu资源被占用严重,所以在判断到队列为空和时间未到都会开始阻塞,而时间未到的阻塞还会另外设定一个时间,这个时间就是距离实际执行方法时间的差值,尽管线程被唤醒可能还是没有到执行时间,因为是优先级队列,唤醒的是最早执行的,那么也不过是再进去while循环做一次时间和队列为空判断,对于长时间循环而言,这些消耗微不足道。

这里并不适合使用sleep

保证线程安全的思路

进程和线程

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

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

相关文章

解释全连接层的“参数数量”和“计算过程”,保证像看动画片一样直观~

假设场景输入图像:一张极小的 灰度图(即 H2,W2,共4个像素),像素值如图所示:隐藏层:假设隐藏层也是 (即 H2,W2,共4个神经元),每个神经元用 ( 表示…

DOM编程实例(不重要,可忽略)

文章目录 简介 表格增加删除&#xff0c;效果如下图 样式属性案例 简介 DOM---表格添加删除&#xff0c;样式属性案例 表格增加删除&#xff0c;效果如下图 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><met…

​Windows API 介绍及核心函数分类表

Windows API 介绍​ Windows API&#xff08;Application Programming Interface&#xff09;&#xff0c;也称为WinAPI&#xff0c;是微软Windows操作系统的核心编程接口。它提供了一系列函数、消息、数据结构、宏和系统服务&#xff0c;允许开发者创建运行在Windows平台上的应…

Kubernetes Dashboard UI 部署安装

K8S 集群环境&#xff1a; Ubuntu 24 / K8S 1.28.21. 推荐使用helm 安装Kubernetes Dashboardsudo snap install helm --classic2. 部署Kubernetes Dashboard# Add kubernetes-dashboard repository helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboar…

python-enumrate函数

文章目录基本语法基本用法基本遍历指定起始索引实际应用场景需要索引的循环创建字典映射处理文件行号与range(len())对比注意事项enumerate()是Python内置函数&#xff0c;用于在遍历序列&#xff08;如列表、元组或字符串&#xff09;时同时获取索引和值。基本语法 enumerate…

FPGA通信设计十问

1. FFT有什么用&#xff1f;FFT&#xff08;快速傅里叶变换&#xff09;是离散傅里叶变换&#xff08;DFT&#xff09;的高效实现算法&#xff0c;它的核心作用是快速将信号从时域转换到频域&#xff0c;从而简化信号分析和处理的过程。自然界的信号&#xff08;如声音、图像、…

代理模式——Java

代理模式 在Java中代理模式是一种设计模式&#xff0c;是通过代理类来代替原始的对象&#xff0c;可以在不改变原始对象的基础上&#xff0c;对它进行扩展&#xff08;新增一些新功能&#xff09;。在目标方法的执行的执行前后添加一些自定义的方法。 静态代理 步骤&#xff1a…

基于Catboost算法的茶叶数据分析及价格预测系统的设计与实现

文章目录有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍数据采集数据预处理数据分析与可视化大屏设计模型构建系统展示每文一语有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 本研究基于京东官网…

【数据库基础 1】MySQL环境部署及基本操作

目录 一、MySQL部署 1.更新软件包列表 2.查看合适的安装包&#xff1a; 3.安装MySQL 4.启动数据库服务并设置开机自启 5.检测MySQL当前状态 6.配置文件修改 二、基本操作指令 1.登陆MySQL 2.创建用户&修改用户密码 3.查看版本 4.退出MySQL 5.停止MySQL 6.数据…

(C++)任务管理系统(正式版)(迭代器)(list列表基础教程)(STL基础知识)

源代码&#xff1a;#include <iostream> #include <list> #include <string>using namespace std;void menu(){cout<<"\n 任务管理系统 "<<endl;cout<<"1.添加普通任务"<<endl;cout<<"2.添加紧急任务…

创建uniapp项目引入uni-id用户体系使用beforeRegister钩子创建默认昵称

需求描述 基于uniCloud开发项目&#xff0c;通常会使用用户体系&#xff0c;uni-id就是基于uniCloud的用户体系&#xff0c;满足常规需要的账号密码注册、登录&#xff0c;微信登录等快捷方式&#xff0c;如果使用uni-id自带的uni-id-pages插件&#xff0c;账号密码注册的话&a…

Opencv---深度学习开发

在OpenCV中进行深度学习开发&#xff0c;主要围绕其dnn模块展开&#xff0c;该模块支持加载预训练模型、预处理输入数据、执行推理计算以及解析输出结果。本文讲解基于OpenCV进行深度学习开发的基本流程。 一、准备工作 在开始开发前&#xff0c;需完成环境配置和资源准备&…

【C++11】右值引用详解

文章目录前言1. 左、右值的概念1.1 左值1.2 右值1.3 右值引用2. 右值引用的价值和使用场景2.1 左值引用的价值和缺陷2.2 右值引用的价值和使用场景2.3 小结3. 完美转发4. 类的移动构造和移动赋值前言 在C11之前&#xff0c;面对C11之前出现的临时对象的传参构造&#xff0c;都…

如何用自指理解世界

自指即自我指涉&#xff0c;即自己的描述关联到了自己&#xff0c;典型例子是“这句话是假话”这个悖论。人类对自指的研究由来已久&#xff0c;很多概念、定理都与之相关&#xff0c;由于它的巧妙性&#xff0c;很多学者对其展开了深入研究&#xff0c;并且认为自指是理解宇宙…

Next.js 实战笔记 2.0:深入 App Router 高阶特性与布局解构

Next.js 实战笔记 2.0&#xff1a;深入 App Router 高阶特性与布局解构 上一篇笔记&#xff1a; Next.js 实战笔记 1.0&#xff1a;架构重构与 App Router 核心机制详解 上篇笔记主要回顾了一些 Next12 到 Next15 的一些变化&#xff0c;这里继续学习/复习一些已有或者是新的…

TCP 传输时 sk_buff 的 clone 和 unclone

周一有位朋友咨询个问题&#xff0c;问题本身不重要&#xff0c;但牵扯出的细节却是非常有趣。 Linux 内核协议栈的 skb 设计非常高效和精巧&#xff0c;多个 skb 可以指向同一块 data&#xff0c;这就是 clone&#xff0c;当 data 不止一个 skb 指示时&#xff0c;任何一个 s…

【51单片机】51单片机学习笔记-课程简介

00. 目录 文章目录00. 目录01. 学习哪种类型的单片机02. 学习单片机方法03. 学习单片机硬件设备04. 学习单片机软件设备05. 学完单片机能做什么06. 附录01. 学习哪种类型的单片机 单片机的型号那么多&#xff0c;该如何选择一款合适的进行学习呢&#xff1f;这里给读者首推的当…

【Docker基础】Docker端口映射(-p参数)深度解析与实践指南

目录 前言 1 Docker网络基础 1.1 Docker网络模型概述 1.2 容器网络隔离性 2 端口映射基础 2.1 端口映射概念 2.2 为什么需要端口映射 3 -p参数详解 3.1 基本语法 3.2 四种映射格式 3.2.1 完整格式 3.2.2 省略宿主机IP 3.2.3 随机宿主机端口 3.2.4 指定协议类型 …

2、鸿蒙Harmony Next开发:ArkTS语言

目录 什么是ArkTS&#xff1f; ArkTS的发展趋势 ArkTS的定位及约束 ArkTS的对UI的拓展 1、UI描述 2、状态管理&#xff1a; ArkTS语法基础 基本知识&#xff1a;声明 基本知识&#xff1a;类型 基本知识&#xff1a;空安全 基本知识&#xff1a;类型安全与类型推断 …

【Elasticsearch】function_score

如果你希望在 Elasticsearch 查询中降低某些特定 `id` 的文档评分,可以通过 `function_score` 查询结合 `script_score` 函数来实现。`script_score` 允许你使用自定义脚本对文档的评分进行调整。 以下是一个示例,展示如何降低某些特定 `id` 的文档评分: 示例场景 假设我们…