【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 多模态大型语言模型更是将人工智能的能力提升到新的高度,无论从技术先进性还是应用实践能力来看,此模型均可被…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
