【Java基础】线程方法
start():启动线程,使线程进入就绪状态。
run():线程执行的代码逻辑,需要重写该方法。
停止线程
void interrupt() 中断线程,让它重新去争抢cpu
如果目标线程长时间等待,则应该使用interrupt方法来中断等待(强制打断,会发生中断异常InterruptedException)
static void yield() 暂停当前正在执行的线程对象,并执行其他线程
不推荐使用JDK提供的stop()、destroy()方法【已废弃】。推荐线程自己停下来,建议使用一个标志位进行终止变量,当flag=false,则终止线程运行。
package com.shan.demo7;
//测试stop
//1.建议线程正常停止————利用次数,不建议死循环
//2.建议使用标志位————设置一个标志位
//3.不要使用stop或者destroy等过时或者JDK不建议使用的方法
public class TestStop implements Runnable{//1. 设置一个标识位private boolean flag=true;@Overridepublic void run() {int i=0;while(flag){System.out.println("run……Thread"+i++);}}//2. 设置一个公开的方法停止线程,转换标志位public void mystop(){this.flag=false;}public static void main(String[] args) throws InterruptedException {TestStop testStop=new TestStop();new Thread(testStop).start();Thread.sleep(20);int i=0;while(true) {//System.out.println("main"+i++);// 主线程没有其他任务时,运行速度很快,// 很容易出现新建的线程启动后,还没有抢到CPU,// 没有运行过,程序就已经停止运行的情况// 我们可以让主线程休眠,或添加其他任务,// 来观看中止线程的效果i++;if (i==10){//调用stop方法切换标志位,让线程停止testStop.mystop();break;}}}
}
线程休眠
static void sleep(long millis) 让当前正在执行的线程休眠的毫秒数;
sleep存在异常InterruptedException;
sleep时间到达后线程进入就绪状态;
sleep可以模拟网络延时、倒计时等。
每一个对象都有一个锁,sleep不会释放锁。
//模拟网络延时:放大问题的发生性
public class TestSleep implements Runnable {private int ticketNums=10;//票数@Overridepublic void run() {while (true){synchronized (this) {if (ticketNums <= 0) break;System.out.println(Thread.currentThread().getName() + "———拿到了第" + ticketNums-- + "张票");}try {Thread.sleep(100);//模拟延时} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {TestSleep ticket=new TestSleep();new Thread(ticket,"小明").start();new Thread(ticket,"笑笑").start();new Thread(ticket,"淘气").start();}
}
//模拟倒计时
public class TestSleep2 {//模拟倒计时public static void tenDown() throws InterruptedException{int num=10;while(true){Thread.sleep(1000);System.out.println(num--);if (num<=0)break;}}public static void main(String[] args) throws InterruptedException {tenDown();
}
public class TestSleep2 { //打印当前时间public static void main(String[] args) throws InterruptedException {Date startTime=new Date(System.currentTimeMillis());//获取系统当前时间while(true){System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));Thread.sleep(1000);//更新系统当前时间startTime=new Date(System.currentTimeMillis());}}
}
线程礼让
**void yield() ** 礼让不一定成功,得看CPU调度情况
public class TestYield{public static void main(String[] args) {MyYield myYield=new MyYield();new Thread(myYield,"a").start();new Thread(myYield,"b").start();}
}
class MyYield implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"线程开始执行");Thread.yield();System.out.println(Thread.currentThread().getName()+"线程停止执行");}
}
* 礼让成功: * 礼让不成功:
* a线程开始执行 * a线程开始执行
* b线程开始执行 * a线程停止执行
* a线程停止执行 * b线程开始执行
* b线程停止执行 * b线程停止执行
线程强制执行
void join() 等待该线程终止
//测试join方法 (想象为插队)
public class TestJoin implements Runnable {@Overridepublic void run() {for (int i = 0; i < 100; i++) System.out.println("线程vip来了"+i);}public static void main(String[] args) throws InterruptedException {//启动我们的线程TestJoin testJoin=new TestJoin();Thread thread=new Thread(testJoin);thread.start();//主线程for (int i = 0; i < 100; i++) {if (i==50)thread.join();//插队System.out.println("main"+i);}}
}
观测线程状态
boolean isAlive() 测试线程是否处于活动状态
public class TestState {public static void main(String[] args) throws InterruptedException {Thread thread=new Thread(()->{for (int i = 0; i < 5; i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("///");});//观测状态Thread.State state=thread.getState();System.out.println(state);//NEW//观察启动后thread.start();//启动线程state=thread.getState();System.out.println(state);//RUN//只要线程不终止,就一直输出状态while(state!=Thread.State.TERMINATED){Thread.sleep(1000);state=thread.getState();//更新线程状态System.out.println(state);}//thread.start();//线程死亡后不能再次启动}
}
线程优先级
Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行
线程的优先级用数字表示,范围从1~10。主线程和子线程的默认优先级都是5。
优先级高只是先执行的概率高,并不一定先执行;
优先级低只是意味着获得调度的概率低,并不是优先级低就不会被调用
优先级的设定建议在start()调度前
getPriority() 获得当前优先级
setPriority(int pri) 设置线程优先级
Thread.MAX_PRIOROTY=10
Thread.MIN_PRIOROTY=1
Thread.NORM_PRIOROTY=5
public class TestPriority {public static void main(String[] args) {System.out.println(Thread.currentThread().getName()+"----》"+Thread.currentThread().getPriority());MyPriority myPriority=new MyPriority();Thread t1=new Thread(myPriority);Thread t2=new Thread(myPriority);Thread t3=new Thread(myPriority);Thread t4=new Thread(myPriority);Thread t5=new Thread(myPriority);//先设置优先级再启动t1.start();t2.setPriority(1);t2.start();t3.setPriority(3);t3.start();t4.setPriority(10);t4.start();t5.setPriority(8);t5.start();}
}
class MyPriority implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"----》"+Thread.currentThread().getPriority());}
}
守护线程
线程分为用户线程和守护线程,虚拟机必须确保用户线程执行完毕,不用等待守护线程执行完毕,如:后台记录操作日志,监控内存,垃圾回收等。
void setDaemon(boolean on)
守护线程:后台线程,当所有的前台线程全部结束,即使后台线程没执行完,也立刻结束
需在线程启动前设置
//测试守护线程
//上帝守护你
public class TestDaemon {public static void main(String[] args) {God god=new God();You you=new You();Thread thread=new Thread(god);thread.setDaemon(true);//默认是false,表示是用户线程,普通的线程都是用户线程thread.start();//上帝守护线程开启new Thread(you).start();//你 用户线程启动}
}
//上帝
class God implements Runnable{@Overridepublic void run() {while(true){System.out.println("上帝保佑众生");}}
}
//你
class You implements Runnable{@Overridepublic void run() {for (int i = 0; i < 36500; i++) {System.out.println("开心地活着,第"+i+"天");}System.out.println("Goodbye,world!");}
}
用户线程执行完后,守护线程还运行了一会儿是因为,虚拟机关闭需要一定的时间
相关文章:
【Java基础】线程方法
start():启动线程,使线程进入就绪状态。 run():线程执行的代码逻辑,需要重写该方法。 停止线程 void interrupt() 中断线程,让它重新去争抢cpu 如果目标线程长时间等待,则应该使用interrupt方法来中断等待…...
C++之动态数组
C给我们提供了一个叫Vector的类,这个Vector在std命名空间中。这个Vector有点像一个集合,一个不强制其实际元素具有唯一性的集合,和数组一样,但是和C普通的数组又不太一样,和标准的数组不同当你创建Vector时,…...
使用 image-combiner 开源项目实现对海报图片的生成
1:gitee 项目地址 image-combiner: ImageCombiner是一个专门用于Java服务端图片合成的工具,没有很复杂的功能,简单实用,从实际业务场景出发,提供简单的接口,几行代码即可实现图片拼合(当然用于…...
【缓存】框架层常见问题和对策
缓存是为了加快读写速度,再了解redis这类框架层的缓存应用之前,我们不妨先思考下操作系统层面的缓存解决方案,这样有助于我们更深的理解缓存,哪些是系统层面的,哪些是服务层面。 以下是一些常见的缓存问题及其解决方案…...
【FAS】《CN103106397B》
原文 CN103106397B-基于亮瞳效应的人脸活体检测方法-授权-2013.01.19 华南理工大学 方法 / 点评 核心方法用的是传统的形态学和模板匹配,亮点是双红外发射器做差分 差分:所述FPGA芯片控制两组红外光源(一近一远)交替亮灭&…...
3D按F3为什么显示不出模型?---模大狮模型网
对于3D建模软件的用户来说,按下F3键通常是用来显示或隐藏模型的功能之一。然而,有时当按下F3键时,却无法正确显示模型,这可能会让用户感到困惑。模大狮将探讨这种情况发生的可能原因以及解决方法,帮助设计师们更好地理…...
C++设计模式——Adapter适配器模式
一,适配器模式简介 适配器模式是一种结构型设计模式,用于将已有接口转换为调用者所期望的另一种接口。 适配器模式让特定的API接口可以适配多种场景。例如,现有一个名为"Reader()"的API接口只能解析txt格式的文件,给这…...
Python文本处理利器:jieba库全解析
文章目录 Python文本处理利器:jieba库全解析第一部分:背景和功能介绍第二部分:库的概述第三部分:安装方法第四部分:常用库函数介绍1. 精确模式分词2. 全模式分词3. 搜索引擎模式分词4. 添加自定义词典5. 关键词提取 第…...
【C/C++】C语言如何实现类似C++的智能指针?
在C中,智能指针是为了自动化资源管理而引入的工具。比如std::unique_ptr和std::shared_ptr等,它们管理着所持有对象的生命周期,可以在智能指针被销毁时自动释放其所持有的资源。在C语言中,虽然没有直接的智能指针概念,…...
九大微服务监控工具详解
Prometheus Prometheus 是一个开源的系统监控、和报警工具包,Prometheus 被设计用来监控“微服务架构”。 主要解决: 监控和告警:Prometheus 可以对系统、和应用程序进行实时监控,并在出现问题时发送告警;数据收集和…...
java aliyun oss上传和下载工具类
java aliyun oss上传和下载工具类 依赖 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.8.0</version></dependency>工具类 import com.alibaba.fastjson.JSON; import c…...
P7 品牌管理
逆向生成页面 新增菜单—商品系统的品牌管理 —product/brand 在代码生成器得到的文件中, main-resources-src-views-modules-product brand.vue、brand-add-or-update.vue放到category.vue同级vue文件有新增、删除按钮,但页面未显示,是因…...
C语言详解(动态内存管理)1
Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…...
106.网络游戏逆向分析与漏洞攻防-装备系统数据分析-在UI中显示装备与技能信息
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不懂是正常的,只要会抄就行,抄着抄着就能懂了 内容…...
AWS EMR Serverless
AWS概述 EMR Serverless 简介 在AWS概述一文中简单介绍过AWS EMR, 它是AWS提供的云端大数据平台。借助EMR可以设置集群以便在几分钟内使用大数据框架处理和分析数据。创建集群可参考官方文档:Amazon EMR 入门。但集群创建之后需要一直运行,用户需要管理…...
Java面试题:Redis持久化问题
Redis持久化问题 RDB (Redis Database Backup File) Redis数据快照 将内存中的所有数据都记录到磁盘中做快照 当Redis实例故障重启时,从磁盘读取快照文件恢复数据 使用 save/bgsave命令进行手动快照 save使用主进程执行RDB,对所有命令都进行阻塞 bgsave使用子进程执行R…...
【Java】解决Java报错:ClassCastException
文章目录 引言1. 错误详解2. 常见的出错场景2.1 错误的类型转换2.2 泛型集合中的类型转换2.3 自定义类和接口转换 3. 解决方案3.1 使用 instanceof 检查类型3.2 使用泛型3.3 避免不必要的类型转换 4. 预防措施4.1 使用泛型和注解4.2 编写防御性代码4.3 使用注解和检查工具 5. 示…...
OpenCV-最小外接圆cv::minEnclosingCircle
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 函数原型 void minEnclosingCircle(InputArray points, Point2f& center, float& radius); 参数说明 InputArray类型的…...
大小堆运用巧解数据流的中位数
一、思路 我们将所有数据平分成两份,前面那一部分用小堆来存,后面的部分用大堆来存,这样我们就能立刻拿到中间位置的值。 如果是奇数个数字,那么我们就将把中间值放在前面的大堆里,所以会有两种…...
AI能力边界不断扩展,将对国家安全产生深远影响
文 | 中国信息安全测评中心 王欣 随着 ChatGPT 的发布及相关应用的落地,人工智能技术给全球各个行业带来了一波又一波冲击。GPT-4 多模态大型语言模型更是将人工智能的能力提升到新的高度,无论从技术先进性还是应用实践能力来看,此模型均可被…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
