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

📅 2026/7/13 6:18:40 👁️ 阅读次数 📝 编程学习
【多线程 】线程状态 线程停止 线程休眠 线程礼让 线程插队(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());}}

结果