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

【多线程 】线程状态 线程停止 线程休眠 线程礼让 线程插队(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());}}

结果