Java高级Day28-多线程
83.多线程
什么是线程:
-
线程右进程创建的,是进程的一个实体
-
一个进程可以有多个线程
并发:同一个时刻,多个任务交替执行,造成一种貌似同时的错觉
并行:同一个时刻,多个任务同时执行,多核CPU可以实现。可能并发和并行同时存在
通过Java查询电脑的CPU个数:
public class HelloJava {
public static void main(String[] args) {Runtime runtime = Runtime.getRuntime();//获取当前电脑的cpu数量int cpuNums = runtime.availableProcessors();System.out.println("当前电脑的cpu个数=" + cpuNums);}
}
线程基本使用
创建线程的两种方法:
-
继承Thread类,重写run方法
-
实现Runnable接口,重写run方法
注意:若主线程结束了,但还有子线程在运行,就不会导致整个线程关闭
为什么要用cat.start(),而不是直接用cat.run()呢?
run就是一个普通方法,没有真正启动一个线程,就会把run方法执行完毕,才向下执行 ,相当于串行化执行
start才会真正的启动一个线程
(1)
public synchronized void start(){start0();
}
(2)
//start0()是本地方法,是JVM调用,底层是C/C++实现
//真正达到多线程效果的,是start(),而不是run()
private native void start0();
//start()调用start0()方法后,该线程不一定会立马执行,只是将线程变成了可运行状态。具体什么时候执行,取决于CPU,由CPU统一调度
通过Runnable接口实现线程
因为Java是单继承的,在一个类可能已经继承了某个父类,这时在用继承Thread方法来创建线程显然不可行
所以提供了另一个方式创建线程,就是通过实现Runnable接口
Runnable没有start()方法,怎么办呢?
//创建一个Thread对象,把dog对象(实现Runnable),放入Thread
Thread thread = new Thread(dog);
thread.start();
//这里调用start()方法,启动线程,并带动run方法
//这里是因为底层使用了 代理模式,逻辑如下
//线程代理类,模拟了一个极简的Thread
class ThreadProxy implements Runnable{private Runnable target = null;@Overridepublic void run(){if(target != null){target.run();//动态绑定}}public ThreadProxy(Runnable target){this.target = target}public void start(){start0();}public void start0(){run();}
}
多线程案例:
public class HelloJava {public static void main(String[] args) {T1 t1 = new T1();T2 t2 = new T2();Thread thread1 = new Thread(t1);Thread thread2 = new Thread(t2);thread1.start();thread2.start();}
}
class T1 implements Runnable{
int count = 0;
@Overridepublic void run() {while (true) {//每隔一秒,输出“Hello World”,10次System.out.println("hello world " + (++count));try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}if (count == 10){break;}}}
}
class T2 implements Runnable{
int count = 0;
@Overridepublic void run() {while (true) {//每隔一秒,输出“hi”,五次System.out.println("hi " + (++count));try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}if (count == 5){break;}}}
}
通知线程退出:
-
当线程完成任务后,会自动退出
-
还可以通过使用变量来控制run方法退出的方式停止线程,即通知方式
//需求,启动一个线程t,要求在main线程中去停止线程t
public class HelloJava {public static void main(String[] args) throws InterruptedException {T t = new T();t.start();//如果希望主线程控制t线程的终止,必须可以修改loop//让t退出run方法,从而终止t线程 ->通知方式
//让主线程休眠10秒,再通知t线程退出Thread.sleep(1000*10);t.setLoop(false);}
}
class T extends Thread{//设置一个控制变量private boolean loop = true;int count = 0;
@Overridepublic void run() {while (loop) {try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("T 运行中......" + (++count));}}
public void setLoop(boolean loop) {this.loop = loop;}
}
线程常用方法
1.setName 设置线程名称,使之与参数 name 相同
2.getName 返回该线程的名称
3.start 使该下暗藏卡爱上执行,Java虚拟机底层调用该线程的start0方法
4.run 调用线程对象run方法
5.setProiority 更改线程的优先级
6.getProiority 获取线程的优先级
7.sleep 在指定的毫秒数内让当前正在执行的线程休眠
8.interrupt 中断线程
interrupt中断线程,但没有真正的结束线程,所以一般用于中断正在休眠的线程
相关文章:
Java高级Day28-多线程
83.多线程 什么是线程: 线程右进程创建的,是进程的一个实体 一个进程可以有多个线程 并发:同一个时刻,多个任务交替执行,造成一种貌似同时的错觉 并行:同一个时刻,多个任务同时执行&#x…...
0003 保险的会计要素及其计量属性
与一般行业相同,保险业的会计要素主要包括资产、负债、所有者权益、收入、成本与费用以及利润六个方面。然而,在某些特定的要素上,保险业展示了其独特之处。 资产:由于保险本质上是一种承诺而非实物商品,因此保险业不持…...
Swift版本控制的艺术:掌握代码演化的魔杖
标题:Swift版本控制的艺术:掌握代码演化的魔杖 在Swift开发的世界中,代码的版本管理是一个核心议题。它不仅关系到代码的组织和追踪,更是团队协作和项目持续交付的关键。本文将深入探讨如何在Swift中利用版本管理工具,…...
学习实战:生活垃圾自动识别与分类系统的实现
引言 在日常生活中,垃圾分类是保护环境的重要措施之一。然而,手动分类不仅耗时,还容易出错。基于深度学习的垃圾检测与分类系统能够自动识别和分类不同类型的垃圾,从而提高分类效率。 目录 项目概述 项目背景与意义系统功能介绍…...
Swift模块化构建:解锁代码重用的金钥匙
标题:Swift模块化构建:解锁代码重用的金钥匙 在Swift编程的宏伟蓝图中,模块化不仅是提升代码组织性的关键,更是实现高效开发与维护的法宝。本文将深入探讨Swift模块化构建工具的使用,揭示如何通过模块化将代码转化为可…...
【计算机网络】CIDR无分类编址知识学习
文章目录 1、CIDR引入的背景2、CIDR是什么?2.1 CIDR的2个特点2.2 CIDR斜线记法注意区分细节2.3 路由聚合or构成超网2.4 CIDR里面的掩码(不是叫子网掩码)2.5 CIDR几种等效的记法形式2.6 对于”网络前缀“不是8的整数倍时候,要多加注意 3、CIDR…...
JavaScript 详解
第一章 JavaScript简介 为什么学习javascript ? JavaScript 是全球最流行的编程语言。 JavaScript 是属于 Web 的编程语言。 JavaScript 是 web 开发者必学的三种语言之一: HTML 定义网页的内容 CSS 规定网页的布局 JavaScript 对网页行为进行编程 …...
运维实践01-安装OpenJDK
前几天逛知乎,有个问题是如何成为一个优秀的运维工程师,有个回答是让自己搞清楚如下几件事情。 首先,搭4台Linux的服务器。然后完成如下操作 批量安装最新版OpenJDK安装部署elastic search集群安装部署mysql9.0,实现一主三备。安…...
Windows下,C# 通过FastDDS高效通信
目录 1、安装FastDDS 库2、使用IDL定义自己的数据格式3、生成DLL3.1 托管 (Managed)模式3.2 非托管 (Unmanaged)模式 -- 可用于Unity 代码示例 eprosima Fast DDS is a C implementation of the DDS (Data Distribution Service) …...
【模型】ResNet
ResNet(Residual Network,残差网络)是一种用于图像识别等任务的深度神经网络架构,由何凯明等人于2015年提出。它在计算机视觉领域中具有重要意义,因为它解决了随着网络层数加深而导致的“梯度消失”或“梯度爆炸”问题…...
Objective-C中NSExpression与NSPredicate的协同艺术
标题:Objective-C中NSExpression与NSPredicate的协同艺术 引言 在Objective-C的丰富生态中,NSExpression和NSPredicate是两个强大的工具,它们在处理数据集合和执行复杂查询时发挥着关键作用。本文将深入探讨这两个API的协同工作方式&#x…...
Apache-JMeter压测工具教程
下载安装 《JMeter官网下载》 下载完成后,找个文件夹进行解压 配置环境变量 JAVA_HOME(如果是JAVA8还需要配置CLASSPATH)、JMETER_HOME JMETER_HOME修改bin目录下的jmeter.properties文件编码为UTF-8 5.6.3这个版本encoding已经默认为UT…...
Spring Boot集成selenium实现自动化测试
1.什么是selenium? Selenium 是支持web 浏览器自动化的一系列工具和 库的综合项目。 它提供了扩展来模拟用户与浏览器的交互,用于扩展浏览器分配的分发 服务器, 以及用于实现W3C WebDriver 规范 的基础结构, 该规范允许您为所有主…...
基于phpstudy对cmseasy5.5进行漏洞复现
目录: 漏洞复现的cmseasy5.5百度网盘链接 安装cmseasy: 1.在phpstudy上安装cmseasy 2.设置mysql密码为phpstudy内置mysql的密码并检查安装环境 3.安装后查看mysql内cmseasy是否有内容 获取用户名和密码过程: 1.查看源码发现有个remotelo…...
【c++】 C语言的输入与输出C++的IO流STL空间配置器
主页:醋溜马桶圈-CSDN博客 专栏:c_醋溜马桶圈的博客-CSDN博客 gitee:mnxcc (mnxcc) - Gitee.com 目录 1.C语言的输入与输出 2.流是什么 3.CIO流 3.1 C标准IO流 3.2 C文件IO流 4.stringstream的简单介绍 5.什么是空间配置器 6.为什么需要…...
基于Faster-RCNN的停车场空位检测,支持图像和视频检测(pytorch框架)【python源码+UI界面+功能源码详解】
功能演示: 基于Faster-RCNN的停车场空位检测系统,支持图像检测和视频检测(pytorch框架)_哔哩哔哩_bilibili (一)简介 基于Faster-RCNN的停车场空位检测系统是在pytorch框架下实现的,这是一个…...
Vue3从零开始——带你轻松掌握组件的基本操作
文章目录 1. Vue 组件的基础概念1.1 什么是组件?1.2 组件的作用1.3 组件的分类(全局组件 vs 局部组件) 2. 创建和注册组件2.1 单文件组件(SFC)2.2 全局组件注册2.3 局部组件注册 3. 组件命名格式4. ref获取DOM元素4.1 …...
【MySQL 03】库的操作 (带思维导图)
文章目录 🌈 一、创建数据库🌈 二、查看数据库🌈 三、使用数据库🌈 四、修改数据库🌈 五、删除数据库🌈 六、备份数据库🌈 七、恢复数据库🌈 八、字符集和校验规则⭐ 1. 查看系统默认…...
SpringBoot-读取配置文件内容
目录 前言 主页(端口号默认8080) 1 Value 注解 引用变量的使用 2 Environment 对象 3 ConfigurationProperties (配置内容和对象,进行相互绑定) 前言 读取配置文件有3 种方式 (1) Value注解 (2) Environm…...
springboot整合springmvc
1、创建springboot项目,勾选Spring web 当前springboot选择的是2.6.13版本,jdk1.8尽量选2.几的springboot 2、在pom.xml中导入相应的坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
