多线程---创建及方法
*线程创建的方式:
1.继承Thread类,重写run方法。
2.实现Runnable接口,重写run方法。
实际这两个run方法都重写的是Runnable中的run方法
简化方法:
1.匿名内部类创建Thread 子类对象
Thread thread = new Thread(){@Overridepublic void run() {while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("hello Thread...");}}};
模板:
Thread thread = new Thread(){
run( )
};
2.匿名内部类创建Runnable子类,实现Runnable接口,并重写run方法
Thread thread1 = new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("hello Runnable...");}}});
模板:
Thread thread1 = new Thread(new Runnable() {
run()
});
3.lambda表达式创建
Thread thread2 = new Thread(() -> {while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("hello lambda...");}});
模板:
Thread thread2 = new Thread(() -> {
语句
});
*多线程的实现
假如有一个任务,分别让一个人单独完成,和二个人同时完成。显然是二个人较快。
多线程也是如此。
例如:
public static void main(String[] args) {Thread thread1 = new Thread(() -> {while (true) {System.out.println("工作任务-5...");}});Thread thread2 = new Thread(() -> {while (true) {System.out.println("工作任务-5...");}});//多线程thread1.start();thread2.start();}
当任务较大时,多线程可以节省将近一半时间。
当任务较少时,不建议使用多线程,这会造成系统资源浪费。
* 线程类及其常见方法
1.常见构造方法
在后台查看线程时,如果每个线程都有自己的名字,那么出错时就会很快找到。
Thread()创建线程对象
Thread(Runnable target)使用Runnable对象创建线程
Thread(String name)创建线程对象,并命名
Thread(Runnable target , String name)使用Runnable对象创建线程,并命名
public class Thread_name {public static void main(String[] args) {Thread thread4 = new Thread(() ->{while (true) {System.out.println("我有名字:" + Thread.currentThread().getName());}},"Thread");thread4.start();}
}
注: Thread.currentThread()用于线程内调用线程对象
2. Thread的几个常见属性
属性 | 获取方法 |
ID | getId() |
名称 | getName() |
状态 | getState() |
优先级 | getPriority() |
是否后台线程 | isDaemon() |
是否存活 | isAlive() |
是否被中断 | isInterrupted() |
这个ID是JVM默认为Thread对象生成的编号,属于Java层面,要和PCB区分开,PCB是操作系统层面的
也是JAVA层面的
我们看一看有哪些状态:
NEW:表示创建好了一个Java线程对象,安排好了任务,处于准备就绪状态。
但是还没有启动没有调用start()方法之前是不会创建PCB的,和PCB没有任何关系
RUNNABLE:正在运行+准备就绪状态,最常见的状态
有系统PCB
BLOCKED:等待锁的状态,阻塞的一种。(因为 锁竞争 引起的阻塞)
WAITING :没有等待时间,一直死等,直到被唤醒。
TIMED_WAITING:指定了等待时间的阻塞状态,过时不侯
TERMINATED:结束,完成状态,PCB已经销毁,但是JAVA线程对象还在
线程已经结束,Thread对象还存在
创建线程时默认是前台线程
前台线程可以阻止进程的退出
后台线程不阻止进程的退出
设置成后台线程之后,main方法执行完成之后整个程序就退出了,子线程也就自动结束了
如果是前台线程子线程不会受main方法的影响会一直运行下去
描述的是PCB的状态,可以查看run()方法是否执行完成
public static void main(String[] args) {Thread thread = new Thread(() -> {System.out.println("我的名字:" + Thread.currentThread().getName());});System.out.println(thread.getName() + "Id:" + thread.getId());System.out.println(thread.getName() + "状态:" + thread.getState());System.out.println(thread.getName() + "优先级:" + thread.getPriority());System.out.println(thread.getName() + "后台线程:" + thread.isDaemon());System.out.println(thread.getName() + "活着:" + thread.isAlive());System.out.println(thread.getName() + "被中断:" + thread.isInterrupted());thread.start();//执行后System.out.println(thread.getName() + "后台线程:" + thread.isDaemon());System.out.println(thread.getName() + "活着:" + thread.isAlive());System.out.println(thread.getName() + "被中断:" + thread.isInterrupted());}
3.启动一个线程start()
在没有启动线程之前,复写run()方法是发布要执行的任务,创建线程实例是把做任务的人叫了过来,到还没真正开始做任务,只有调用start()方法,这个“线程"才会去执行任务。
4.终止一个线程
1.使用interrupt ()方法,终止一个线程
public static void main(String[] args) {Thread th = new Thread(() -> {while(true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("我在执行...");}});th.start();try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("快终止线程!!");th.interrupt();}
如果程序正常执行他在打印五个执行之后就会被终止但是实际运行却报了异常。
这是因为线程终止时,中止的是sleep方法
这个时候我们就需要在sleep方法中进行逻辑处理,使其达到目标,也就是终止程序
2.自定义一个标志位用于通知线程中断
lambda里面如果使用局部变量
触发“变量捕获”
需要把这个变量定义为全部的
全局静态变量
5.等待一个线程join
有时候我们需要等待一个线程结束后才开始另一个线程,例如:准备好原材料后才能开始制作产品。这时我们就需要join()方法
方法 | 说明 |
public void join() | 等待线程结束 |
public void join(long millis) | 等待线程结束,最多等millis毫秒 |
public void join(long millis, int nanos) | 同理,但精度更高 |
6.获取当前线程的引用
方法 | 说明 |
public static Thread currentThread() | 获取当前对象的引用 |
使用在Thread内部,调用自身
相关文章:
多线程---创建及方法
*线程创建的方式: 1.继承Thread类,重写run方法。 2.实现Runnable接口,重写run方法。 实际这两个run方法都重写的是Runnable中的run方法 简化方法: 1.匿名内部类创建Thread 子类对象 Thread thread new Thread(){Overridepub…...
C++设计模式之单例模式
动机 在软件系统中,经常有一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性,以及良好的效率。 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例? 这应该是类设计…...
给你一个整数n, 判断它是否是素数。注意1不是素数。:JAVA
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 给你一个整数n, 判断它是否是素数。注意1不是素数。 输入描述: 第一行输入一个整数T,表示需要判断的数的个数接下来T行每行一个整数n,表示需要判断的数。1<n<1e5,1<T<…...
Java项目实战II基于微信小程序的电子竞技信息交流平台的设计与实现(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着互联网技术的飞速发展…...
temu登录接口逆向分析(含Py纯算)
文章目录 1. 写在前面2. 接口分析3. 算法还原 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…...
Java ArrayList 详解
Java ArrayList 详解 ArrayList 是 Java 集合框架(Collection Framework)中最常用的类之一,是一种基于动态数组的数据结构,属于 List 接口的实现类。它允许存储重复的元素,有序,支持随机访问,且…...
CTF之密码学(仓颉编码)
一、仓颉码(用于建立中文索引) 定义与目标: 仓颉码是为了建立中文的索引观念而设计的一种编码方式。其主要目标是方便对中文资料或程式进行索引功能的处理。 工作原理: 仓颉码的索引以ASCII的字符码为基准,但在内部会转…...
OpenCV的圆形检测HoughCircles
HoughCircles 函数是 OpenCV 库中用于在灰度图像中检测圆的函数,它基于霍夫变换(Hough Transform)的一种变体——梯度霍夫变换(HOUGH_GRADIENT)函数原型如下: void HoughCircles( InputArray image, OutputArray circles,int method, double dp, double minDist,double …...
Latex 英文双栏排版时,摘要和引言之间的距离
目标:解决这个间隔 打开“cas-common.sty" 搜索“\NewDocumentCommand \dashrule" 本来是两个 m m 变成 m m m然后是增加下面这个代码,其他地方不动 \skip_vertical:n {#4} 搜索”MaketitleBox“和“LongMaketitleBox ” 本来的代码应该…...
AD学习笔记·空白工程的创建
编写不易,禁止搬运,仅供学习,感谢理解 序言 本文参考B站,凡亿教育,连接放在最后。 创建工程文件 在使用AD这个软件的电路板设计中,有很多的地方跟嘉立创eda还是有不一样的地方,其中一个地方就…...
非球面加工领域的佼佼者:倚光科技
在光学领域,非球面加工技术宛如一颗璀璨的明珠,以其独特的优势和广泛的应用,引领着光学元件制造的新潮流。 非球面透镜,其表面曲率半径从中心到边缘是变化的,这使得它在光学系统中具有诸多显著优势。首先,…...
Git分布式版本控制工具 Git基本概念、Git工作流程、Git常用命令、Git远程仓库、IDEA操作Git
目录 1.Git基本概念 1.1 概述 1.1.1 开发中的实际场景 1.1.2 版本控制器的方式 1.1.2.1 集中式版本控制工具(SVN) 1.1.2.2 分布式版本控制工具(Git) 2.概述git工作流程 3.Git常用命令 3.1 Git环境配置 3.1.1 下载与安装 3.1.2 基本配置 3.1.3 为常用指令配置别名&…...
Spring 容器管理 Bean
Bean是什么 Bean 是指 Java 中的可重用软件组件,容器会根据提供的元数据来创建和管理这些 Bean,也包括它们之间的依赖关系。Spring 容器对 Bean 并没有太多的要求,无须实现特定接口或依赖特定库,只要是最普通的 Java 对象即可,这类对象也被称为 POJO(Plain Old Java Obj…...
Spring 容器 详解
Spring 容器详解 Spring 容器 是 Spring 框架的核心组件之一,它负责创建和管理应用程序中的 Bean(对象)以及处理它们之间的依赖关系。容器通过控制反转(IoC)和依赖注入(DI)实现对象的生命周期管…...
ubuntu环境下安装electron环境,并快速打包
1.配置镜像源 关闭防火墙,命令:sudo ufw disable 1.1配置国内镜像源: vim /etc/apt/source.list deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiversedeb-src https://mirrors.aliyun.com/ubuntu/ jammy main…...
Yeeco成长型一体化数智赋能平台:科技矩阵重塑企业数字生态
随着科技的飞速发展,我们正在步入一个被称为“数智化时代”的新时代。在这个时代中,数据处理和分析的能力被提升到一个前所未有的高度,而这种变化背后的重要推动力量就是各种新兴的技术趋势。 为了在激烈的市场竞争中脱颖而出,Yee…...
DP、CP、Mn是什么?有什么关系?双径节齿轮又是什么?
有一些刚刚接触齿轮的小伙伴们,经常听到和齿轮相关的是Mn这个代号,有时候拿到图纸会碰到DP和CP的图纸,今天就简单数一数他们三个的关系: 径节DP 齿轮的节距定义为两个相邻齿轮齿上两个相同点之间的距离。在理想情况下,…...
Python 中的生成器是什么?
生成器(Generator)是Python中一种特殊的迭代器,它允许你逐步生成一系列值,而不是一次性创建整个列表或集合。 这在处理大型数据集或流式数据时特别有用,因为你可以逐个处理元素,而不需要将所有元素加载到内…...
如何参加华为欧拉考试?
华为欧拉考试主要针对的是华为欧拉(EulerOS/openEuler)操作系统的认证考试,这一认证体系旨在培养和认证具备基于欧拉操作系统进行企业级应用运行基础环境搭建、管理和调测能力的工程师以及云计算架构师。以下是对华为欧拉考试的详细介绍&…...
基于STM32设计的智能家居控制系统(华为云IOT)_275
文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成【4】设计意义【5】国内外研究现状【6】摘要1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发1.5 参考文献1.6 系统框架图1.7 系统原理图1.8 实物图1.9…...
2024年第七届传智杯程序设计挑战赛第一场初赛题解
文章目录 2024年第七届传智杯程序设计挑战赛初赛第一场A-吃糖果(B组、C组)B-汤姆和杰瑞(A组、C组)C-游游的重组偶数(A组、B组、C组)D-开心还是难过(B组、C组)E-小欧的平面连线(A组、B组、C组)F-小红的四子棋(A组、B组、C组)G-小红的数组操作(A组、B组)H-游游的不相邻取数(A组) …...
iOS视图控制器的生命周期及各阶段的作用
iOS视图控制器(UIViewController)的生命周期是指从它被创建到最终被销毁的过程中所经历的一系列阶段。每个阶段都有其特定的作用和执行时机,这些阶段和作用对于开发高效、稳定的iOS应用至关重要。以下是iOS视图控制器的生命周期及其各个阶段的…...
stm32上电不能启动什么原因
STM32上电不能启动可能由多种原因造成,以下是一些常见的原因及解决方法: 一、软件原因 程序错误: 程序可能存在死循环、堆栈溢出、指针指向不允许的内存空间等问题。 解决方法:使用调试工具进行调试,检查程序流程,定位并修复错误。 时钟问题: 时钟切换失败或外部时钟源…...
【后端面试总结】golang channel深入理解
在Go语言中,Channel是一种用于在goroutine之间进行通信和同步的重要机制。它提供了一种安全、类型安全的方式来传递数据,使得并发编程变得更加直观和简单。本文将详细介绍Golang中Channel的基本概念、创建与关闭、发送与接收操作,以及相关的使…...
lobeChat安装
一、安装Node.js version > v18.17.0 二、下载 cd F:\AITOOLS\LobeChat git clone https://github.com/lobehub/lobe-chat.git (下载要是失败就手动下:https://codeload.github.com/lobehub/lobe-chat/zip/refs/heads/main) npm install …...
OpenCV 简介与安装方法
大家好啊,我是董董灿。 如果你在做计算机视觉相关的工作,肯定少不了使用 OpenCV 库。 在《计算机视觉专栏》的传统计算机视觉部分,我曾经使用 OpenCV 进行了很多图像的处理,比如边缘检测。 刚好最近在整理一份文稿,…...
力扣刷题TOP101:14.BM16 删除有序链表中重复的元素-II
目录: 目的 思路 复杂度 记忆秘诀 python代码 目的 1→1→2→3→3 删除重复后变成2。 思路 这个任务是删除链表里重复的节点包含本身。可以看成是一个抽奖活动的系统升级。某人通过多种方式报名(节点不同),后台数据检测到这些…...
Hadoop生态圈框架部署 伪集群版(四)- Zookeeper单机部署
文章目录 前言一、Zookeeper单机部署(手动部署)1. 下载Zookeeper安装包到Linux2. 解压zookeeper安装包3. 配置zookeeper配置文件4. 配置Zookeeper系统环境变量5. 启动Zookeeper6. 停止Zookeeper在这里插入图片描述 注意 前言 本文将详细介绍Zookeeper的…...
【Linux】文件
声明:以下内容均学习自《Linux就该这么学》一书 1、文件权限及归属 对目录文件来说,“可读”表示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;“可执行”表示能够进入该目录。 文件类型区分 -普通…...
仿真键盘输入遇到Edge环境不识别 回车符如何处理
这个问题我也是最近才遇到,可能现在大家都喜欢用新架构,基于网页来写应用管理软件。 当遇到Edge环境下,文本框不识别回车符如何处理,根据笔者经验可通过配置Edge 基于键盘管理设置来解决这个事情。如图 即在Edge浏览器环境下&…...
Python 列表操作详解
Python 列表操作详解 在 Python 中,列表(list)是一种用于存储有序集合的数据结构。列表可以包含各种类型的数据,如整数、浮点数、字符串等,甚至可以包含其他列表(这称为嵌套列表)。 示例列表 …...
Git操作学习2
1.使用git rm删除文件 查看文件夹的内容 ls -lr 删除文件rm 文件名 但是此时只删了工作区的文件,仓库还没有删 可以再使用git add更新提交给仓库 也可以直接通过git rm 删除仓库里面的文件 工作区也删除了 暂存区也删除了 最后记得提交 否则删除的文件在版本库还…...
Spring Event 监听与异步设置:深入解析与应用场景
在开发中,事件驱动编程(Event-Driven Programming)是一种常见的编程模式,Spring 提供了强大的事件机制,使得我们可以通过 EventListener 或 ApplicationListener 来监听和处理应用中的各种事件。这种机制不仅使得应用架…...
百度木木浆测试
本程序测试识别图片的文字 import cv2 from paddleocr import PaddleOCR, draw_ocr from matplotlib import pyplot as plt # 加载PaddleOCR模型,这里你可以根据需要选择语言和模型路径 ocr PaddleOCR(use_gpuFalse, langch) # 假设我们识别中文字符,…...
视频监控集中管理方案设计:Liveweb视频汇聚方案技术特点与应用
随着科技的发展,视频监控平台在各个领域的应用越来越广泛。然而,当前的视频监控平台仍存在一些问题,如视频质量不高、监控范围有限、智能化程度不够等。这些问题不仅影响了监控效果,也制约了视频监控平台的发展。 为了解决这些问…...
剑指offer(专项突破)---字符串
总目录:剑指offer(专项突破)---目录-CSDN博客 1.字符串的基本知识 C语言中: 函数名功能描述strcpy(s1, s2)将字符串s2复制到字符串s1中,包括结束符\0,要求s1有足够空间容纳s2的内容。strncpy(s1, s2, n)…...
Zygote启动流程(AndroidV)
一:背景 众所周知,Android应用及system_server基本都是由zygote fork出来的,那么zygote是如何启动的、又是如何接收fork进程的请求,接下来一步步揭秘。 二:启动流程 init进程是Android系统启动时,启动的第一…...
Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:智行无忧停车场管理系统(前后端源码 + 数据库 sql 脚本)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 项目介绍 1.1 项目功能 2.0 用户登录功能 3.0 首页界面 4.0 车辆信息管理功能 5.0 停车位管理功能 6.0 入场登记管理功能 7.0 预约管理功能 8.0 收费规则功能 9.0…...
岩体力学的材质-力学等属性的自动划分.
#背景: 在力学求解过程中,我们往往会对目标物体进行网格划分, 那么如何做到自动完成这个过程呢? 这里使用岩体力学中的地下岩层进行举例,这里只是简单的导入了4种界面, 复杂的可以一次性导入几十种界面,都可以计算(你能分多细,这个计算方式就可以帮你分层多细) 这里我只是导…...
注解 实现原理 详解
Java 注解实现原理详解 注解(Annotation)是 Java 提供的一种元数据机制,用于为代码元素(类、方法、字段、参数等)添加额外的信息。注解不会直接影响程序逻辑,但可以通过 工具(如编译器、运行时…...
第4章 陷入与系统调用
有三种类型的事件会让CPU停止正常执行的指令,强制切换到指定的代码,处理这些事件。一种是系统调用,当用户程序执行ecall指令来让内核为它做一些事。另一种是异常:一个指令(用户或内核)做了一些非法的事&…...
项目基于oshi库快速搭建一个cpu监控面板
后端: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.github.oshi</groupId><artifactId>oshi-…...
力扣C语言刷题记录 (二)移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作: 更改…...
多模态大语言模型的对比
简介 文章主要对比了包括 VideoLLaMA 2 、CogVLM2-video 、MiniCPM-V等模型 目前主流的多模态视觉问答大模型,大部分采用视觉编码器、大语言模型、图像到文本特征的投影模块 目录 简介1. VideoLLaMA 21.1 网络结构1.2 STC connector具体的架构 2. MiniCPM-V 2.62.…...
关于最近od机考中--树
题目 树按照层级遍历获取非叶子结点,然后将非叶子结点以后序遍历打印。 eg 图解 只需要将1,3,4,2进行后序遍历打印:既左-右-中方式打印 最后结果如:2,3,4,1。 思路&a…...
基数排序(代码+注释)
#include <stdio.h> #include <stdlib.h>// 获取数组中的最大值 int GetMax(int* a, int n) {int max a[0];for (int i 1; i < n; i) {if (a[i] > max) {max a[i];}}return max; }// 对数组按照某个位数进行计数排序 void CountingSortForRadix(int* a, i…...
NLP 相关知识的构成
自然语言处理(Natural Language Processing, NLP) 自然语言处理相关知识 自然语言处理(Natural Language Processing, NLP)什么是自然语言处理?自然语言处理的构成1. 基本术语1.1 分词(Segmentation&#x…...
算力100问☞第20问:GPU算力的影响因素有哪些?
影响因素1:核心数量 GPU中的计算核心数量是决定其算力的关键因素之一。更多的计算核心意味着可以同时处理更多的数据和任务,从而提高整体的计算效率。例如,GPU里面的计算核心就好像是工厂里的工人。工人数量越多,同时干活儿的也就…...
C语言柔性数组
在C语言中,结构体定义数组指定长度0,sizeof时候不计入占用,实际分配时候占用为准! 也许你从来没有听说过柔性数组的概念,但其确实存在。C99规定:结构中的最后一个元素允许是未知大小的数组,这就…...
TensorFlow与PyTorch对比:哪个更适合初学者?
小贴士: 不必着急,慢慢消化每一部分。有问题就查阅示例,实践是最好的老师!别忘了,选择合适的框架才是王道!💻🔍 本文全面对比了 TensorFlow 与 PyTorch 两大深度学习框架,详细分析了它们的特点、优势及适用场景,帮助初学者做出框架选择。内容包含框架背景、代码示例…...