当前位置: 首页 > news >正文

【多线程 】线程状态 线程停止 线程休眠 线程礼让 线程插队(Join) 线程状态观测 线程优先级 守护线程 并发 线程同步 队列和锁 线程同步

线程状态



线程五大方法

线程停止

代码

packagecom.jiang.lesson3;//测试stop//1.建议线程正常停止---->利用次数,不建议死循环//2.建议使用标志位---->设置一个标志位、//3.不要使用stop或者destory等过时或者JDK不建议使用的方法publicclassTestStopimplementsRunnable{//1.设置一个标志位privatebooleanflag=true;@Overridepublicvoidrun(){inti=0;while(flag){System.out.println("run....Thread"+i++);}}//2.设置一个公开的方法停止线程,转换标志位publicvoidstop(){this.flag=false;}publicstaticvoidmain(String[]args){TestStoptestStop=newTestStop();newThread(testStop).start();for(inti=0;i<1000;i++){System.out.println("main"+i);if(i==900){//调用stop方法切换标志位,让线程停止testStop.stop();System.out.println("线程该停止了");}}}}

结果

线程休眠

代码

packagecom.jiang.lesson3;importcom.jiang.lesson1.TestThread04;//模拟网络延时:放大问题的发生性publicclassTestSleepimplementsRunnable{//票数privateintticktNums=10;@Overridepublicvoidrun(){while(true){if(ticktNums<=0){break;}//模拟延时try{Thread.sleep(200);//休眠}catch(InterruptedExceptione){e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"-->拿到了第"+ticktNums--+"票");}}publicstaticvoidmain(String[]args){TestSleepticket=newTestSleep();newThread(ticket,"明").start();newThread(ticket,"老师").start();newThread(ticket,"黄牛").start();}}

结果

代码1

packagecom.jiang.lesson3;//模拟倒计时publicclassTestSleep01{publicstaticvoidmain(String[]args){try{tenDown();}catch(Exceptione){e.printStackTrace();}}//模拟倒计时publicstaticvoidtenDown()throwsInterruptedException{intnum=10;while(true){Thread.sleep(1000);System.out.println(num--);if(num<=0){break;}}}}

结果

代码2

packagecom.jiang.lesson3;importjava.text.SimpleDateFormat;importjava.util.Date;//模拟倒计时publicclassTestSleep02{publicstaticvoidmain(String[]args){//打印当前系统时间DatestartTime=newDate(System.currentTimeMillis());//获得系统当前时间while(true){try{Thread.sleep(1000);System.out.println(newSimpleDateFormat("HH:mm:ss").format(startTime));startTime=newDate(System.currentTimeMillis());//更新当前时间}catch(Exceptione){e.printStackTrace();}}}//模拟倒计时publicstaticvoidtenDown()throwsInterruptedException{intnum=10;while(true){Thread.sleep(1000);System.out.println(num--);if(num<=0){break;}}}}

结果

线程礼让


线程插队(Join)

代码

packagecom.jiang.lesson3;//测试JION方法//想象为插队publicclassTestJoinimplementsRunnable{@Overridepublicvoidrun(){for(inti=0;i<100;i++){System.out.println("线程vip来了"+i);}}publicstaticvoidmain(String[]args)throwsInterruptedException{//启动我们的线程TestJointestJoin=newTestJoin();Threadthread=newThread(testJoin);//主线程for(inti=0;i<1000;i++){if(i==200){thread.start();thread.join();//插队}System.out.println("main"+i);}}}

结果

线程状态观测

代码

packagecom.jiang.lesson3;//观察测试线程的状态publicclassTestState{publicstaticvoidmain(String[]args)throwsInterruptedException{Threadthread=newThread(()->{try{Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("////////");});//观察状态Thread.Statestate=thread.getState();System.out.println(state);//new//观察启动后thread.start();//启动线程state=thread.getState();System.out.println(state);//Runwhile(state!=Thread.State.TERMINATED){//只要线程不中止,就一直输出状态Thread.sleep(100);state=thread.getState();//更新线程状态System.out.println(state);//输出状态}}}

结果


线程优先级

代码

packagecom.jiang.lesson3;importjava.sql.SQLOutput;//测试线程的优先级publicclassTestPriority{publicstaticvoidmain(String[]args){//主线程默认优先级最高//优先级高给的资源多,但并不一定排前列,看CPU心情System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority());MyPrioritymyPriority=newMyPriority();Threadt1=newThread(myPriority);Threadt2=newThread(myPriority);Threadt3=newThread(myPriority);Threadt4=newThread(myPriority);Threadt5=newThread(myPriority);Threadt6=newThread(myPriority);//先设置优先级,再启动t1.start();t2.setPriority(1);t2.start();t3.setPriority(4);t3.start();t4.setPriority(Thread.MAX_PRIORITY);//MAX_PRIORITY=10t4.start();t5.setPriority(-1);t5.start();t6.setPriority(11);t6.start();}staticclassMyPriorityimplementsRunnable{@Overridepublicvoidrun(){System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority());}}}

结果

守护线程

代码

packagecom.jiang.lesson3;//测试守护线程//上帝守护你publicclassTestDaemon{publicstaticvoidmain(String[]args){Godgod=newGod();Youyou=newYou();Threadthread=newThread(god);thread.setDaemon(true);//默认是FLASE表示是用户线程,正常的线程都是用户线程。。thread.start();//上帝守护线程启动newThread(you).start();//你 用户线程启动}}//上帝classGodimplementsRunnable{@Overridepublicvoidrun(){while(true){System.out.println("上帝保佑着你");}}}//你classYouimplementsRunnable{@Overridepublicvoidrun(){for(inti=0;i<36500;i++){System.out.println("你一生都在开心的活着");}System.out.println("======goodbye!world======");}}

结果

线程同步

并发

线程同步

队列和锁

线程同步

代码1

packagecom.jiang.syn;//不安全的买票//线程不安全,有负数publicclassUnsafeBuyTicket{publicstaticvoidmain(String[]args){BuyTicketstation=newBuyTicket();newThread(station,"你").start();newThread(station,"我").start();newThread(station,"他").start();}}classBuyTicketimplementsRunnable{//票privateintticketNums=10;booleanflag=true;//外部停止方式@Overridepublicvoidrun(){//买票while(flag){try{buy();}catch(Exceptione){e.printStackTrace();}}}privatevoidbuy()throwsInterruptedException{//判断是否有票if(ticketNums<=0){flag=false;return;}//模拟延时Thread.sleep(1000);//买票System.out.println(Thread.currentThread().getName()+"拿到"+ticketNums--);}}

结果

代码2

packagecom.jiang.syn;//不安全的取钱//两个人去银行取钱,账户publicclassUnsafeBank{publicstaticvoidmain(String[]args){//账号Accountaccount=newAccount(100,"结婚基金");Drawingyou=newDrawing(account,50,"你");DrawinggirlFriend=newDrawing(account,100,"祁🐟");you.start();girlFriend.start();}}//账户classAccount{intmoney;//余额Stringname;//卡名publicAccount(intmoney,Stringname){this.money=money;this.name=name;}}//银行:模拟取款classDrawingextendsThread{Accountaccount;//账户//取了多少钱intdrawingMoney;//现在手里有多少钱intnowMoney;publicDrawing(Accountaccount,intdrawingMoney,Stringname){super(name);this.account=account;this.drawingMoney=drawingMoney;this.nowMoney=nowMoney;}//取钱@Overridepublicvoidrun(){//判断有没有钱if(account.money-drawingMoney<0){System.out.println(Thread.currentThread().getName()+"钱不够,取不了");return;}//sleep可以放大问题的发生性try{Thread.sleep(1000);}catch(Exceptione){e.printStackTrace();}//卡内余额 = 金额-你取的钱account.money=account.money-drawingMoney;//你手里的钱nowMoney=nowMoney+drawingMoney;System.out.println(account.name+"余额为"+account.money);// Thread.currentThread().getName() = this.getName()System.out.println(this.getName()+"手里的钱"+nowMoney);}}

结果

代码3

packagecom.jiang.syn;importjava.sql.Array;importjava.util.ArrayList;importjava.util.List;//线程不安全的集合publicclassUnsafeList{publicstaticvoidmain(String[]args){List<String>list=newArrayList<>();for(inti=0;i<10000;i++){newThread(()->{list.add(Thread.currentThread().getName());}).start();}try{Thread.sleep(1000);}catch(Exceptione){e.printStackTrace();}System.out.println(list.size());}}

结果

http://www.jsqmd.com/news/1178797/

相关文章:

  • HarmonyOS7 多线程:Worker 让耗时任务不再卡 UI
  • CentOS 7 搭建 DNS 主从服务
  • 我的本地化AI项目(三)
  • Claude 被封号,字节免费提供 GLM-5.2
  • 生产环境Socket编程落地实战指南(TCP/UDP工程化方案)
  • 百度网盘解析工具完整指南:三步告别限速困扰,实现高速下载自由
  • Ubuntu 20.04源码编译ROS2 Foxy实战指南
  • 等价类划分法实战:城市电话号码15个测试用例设计,覆盖4有效11无效
  • Prometheus Pushgateway v1.2.0 部署与配置:Kubernetes 集群 3 步集成实战
  • TPS61170与TM4C129XNCZAD的高效DC-DC升压方案解析
  • 高精度ADC选型与MCP3551应用指南
  • Android Studio完整界面汉化指南:5分钟实现IDE本地化终极方案
  • BepInEx框架解析:解决Unity插件开发三大痛点与实战优化
  • AI FDE 能力模型详解:从价值判断到资产复用的七项能力
  • 无血性者,难以为领
  • 读代码、修 Bug、补测试、写文档:四套拿来即用的工作流模板
  • ArcGIS Pro 3.2 三维地质建模:从钻孔数据到MultiPatch体模型的7步实战
  • 模板驱动型文档自动化:结构化组装替代手工写作
  • Tableau 自定义地理编码指南:解决 3 类无法识别位置数据的实战方案
  • IEEE 754 标准解析:从 32 位 float 到 64 位 double 的精度与范围对比
  • 电脑上的功能键到底都是干啥的?一篇文章教你使用功能键
  • Pixhawk固件加载全流程:从Bootloader刷写到飞行验证
  • ADS 2021 三大仿真模型导入实战:DesignKit/SNP/SPICE 的 3 种场景化应用
  • 从 HydroShear 93% Sim-to-Real 成功率看触觉数据标注工具的技术演进
  • C++实现KD-Tree:从原理到实战,解决多维空间最近邻搜索难题
  • 告别GRC繁琐配置!LabVIEW+Lime SDR让信号采集吞吐量飙升5倍
  • Sqribble:轻量级文档工业化流水线解析
  • Perplexity搜索响应慢、信息冗余、来源模糊?紧急修复的4个实时调优参数(2024 Q2最新API行为分析)
  • Node-gyp v10 环境配置:Windows/macOS/Linux 三平台 Python 3.12 路径设置 3 步法
  • 从零实现C++哈希表:核心原理、冲突解决与性能优化实战