【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 多模态大型语言模型更是将人工智能的能力提升到新的高度,无论从技术先进性还是应用实践能力来看,此模型均可被…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...
2.2.2 ASPICE的需求分析
ASPICE的需求分析是汽车软件开发过程中至关重要的一环,它涉及到对需求进行详细分析、验证和确认,以确保软件产品能够满足客户和用户的需求。在ASPICE中,需求分析的关键步骤包括: 需求细化:将从需求收集阶段获得的高层需…...
