【多线程 】线程状态 线程停止 线程休眠 线程礼让 线程插队(Join) 线程状态观测 线程优先级 守护线程 并发 线程同步 队列和锁 线程同步
线程状态线程五大方法线程停止代码packagecom.jiang.lesson3;//测试stop//1.建议线程正常停止----利用次数不建议死循环//2.建议使用标志位----设置一个标志位、//3.不要使用stop或者destory等过时或者JDK不建议使用的方法publicclassTestStopimplementsRunnable{//1.设置一个标志位privatebooleanflagtrue;Overridepublicvoidrun(){inti0;while(flag){System.out.println(run....Threadi);}}//2.设置一个公开的方法停止线程转换标志位publicvoidstop(){this.flagfalse;}publicstaticvoidmain(String[]args){TestStoptestStopnewTestStop();newThread(testStop).start();for(inti0;i1000;i){System.out.println(maini);if(i900){//调用stop方法切换标志位让线程停止testStop.stop();System.out.println(线程该停止了);}}}}结果线程休眠代码packagecom.jiang.lesson3;importcom.jiang.lesson1.TestThread04;//模拟网络延时放大问题的发生性publicclassTestSleepimplementsRunnable{//票数privateintticktNums10;Overridepublicvoidrun(){while(true){if(ticktNums0){break;}//模拟延时try{Thread.sleep(200);//休眠}catch(InterruptedExceptione){e.printStackTrace();}System.out.println(Thread.currentThread().getName()--拿到了第ticktNums--票);}}publicstaticvoidmain(String[]args){TestSleepticketnewTestSleep();newThread(ticket,明).start();newThread(ticket,老师).start();newThread(ticket,黄牛).start();}}结果代码1packagecom.jiang.lesson3;//模拟倒计时publicclassTestSleep01{publicstaticvoidmain(String[]args){try{tenDown();}catch(Exceptione){e.printStackTrace();}}//模拟倒计时publicstaticvoidtenDown()throwsInterruptedException{intnum10;while(true){Thread.sleep(1000);System.out.println(num--);if(num0){break;}}}}结果代码2packagecom.jiang.lesson3;importjava.text.SimpleDateFormat;importjava.util.Date;//模拟倒计时publicclassTestSleep02{publicstaticvoidmain(String[]args){//打印当前系统时间DatestartTimenewDate(System.currentTimeMillis());//获得系统当前时间while(true){try{Thread.sleep(1000);System.out.println(newSimpleDateFormat(HH:mm:ss).format(startTime));startTimenewDate(System.currentTimeMillis());//更新当前时间}catch(Exceptione){e.printStackTrace();}}}//模拟倒计时publicstaticvoidtenDown()throwsInterruptedException{intnum10;while(true){Thread.sleep(1000);System.out.println(num--);if(num0){break;}}}}结果线程礼让线程插队Join代码packagecom.jiang.lesson3;//测试JION方法//想象为插队publicclassTestJoinimplementsRunnable{Overridepublicvoidrun(){for(inti0;i100;i){System.out.println(线程vip来了i);}}publicstaticvoidmain(String[]args)throwsInterruptedException{//启动我们的线程TestJointestJoinnewTestJoin();ThreadthreadnewThread(testJoin);//主线程for(inti0;i1000;i){if(i200){thread.start();thread.join();//插队}System.out.println(maini);}}}结果线程状态观测代码packagecom.jiang.lesson3;//观察测试线程的状态publicclassTestState{publicstaticvoidmain(String[]args)throwsInterruptedException{ThreadthreadnewThread(()-{try{Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println(////////);});//观察状态Thread.Statestatethread.getState();System.out.println(state);//new//观察启动后thread.start();//启动线程statethread.getState();System.out.println(state);//Runwhile(state!Thread.State.TERMINATED){//只要线程不中止就一直输出状态Thread.sleep(100);statethread.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());MyPrioritymyPrioritynewMyPriority();Threadt1newThread(myPriority);Threadt2newThread(myPriority);Threadt3newThread(myPriority);Threadt4newThread(myPriority);Threadt5newThread(myPriority);Threadt6newThread(myPriority);//先设置优先级再启动t1.start();t2.setPriority(1);t2.start();t3.setPriority(4);t3.start();t4.setPriority(Thread.MAX_PRIORITY);//MAX_PRIORITY10t4.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){GodgodnewGod();YouyounewYou();ThreadthreadnewThread(god);thread.setDaemon(true);//默认是FLASE表示是用户线程正常的线程都是用户线程。。thread.start();//上帝守护线程启动newThread(you).start();//你 用户线程启动}}//上帝classGodimplementsRunnable{Overridepublicvoidrun(){while(true){System.out.println(上帝保佑着你);}}}//你classYouimplementsRunnable{Overridepublicvoidrun(){for(inti0;i36500;i){System.out.println(你一生都在开心的活着);}System.out.println(goodbye!world);}}结果线程同步并发线程同步队列和锁线程同步代码1packagecom.jiang.syn;//不安全的买票//线程不安全有负数publicclassUnsafeBuyTicket{publicstaticvoidmain(String[]args){BuyTicketstationnewBuyTicket();newThread(station,你).start();newThread(station,我).start();newThread(station,他).start();}}classBuyTicketimplementsRunnable{//票privateintticketNums10;booleanflagtrue;//外部停止方式Overridepublicvoidrun(){//买票while(flag){try{buy();}catch(Exceptione){e.printStackTrace();}}}privatevoidbuy()throwsInterruptedException{//判断是否有票if(ticketNums0){flagfalse;return;}//模拟延时Thread.sleep(1000);//买票System.out.println(Thread.currentThread().getName()拿到ticketNums--);}}结果代码2packagecom.jiang.syn;//不安全的取钱//两个人去银行取钱账户publicclassUnsafeBank{publicstaticvoidmain(String[]args){//账号AccountaccountnewAccount(100,结婚基金);DrawingyounewDrawing(account,50,你);DrawinggirlFriendnewDrawing(account,100,祁);you.start();girlFriend.start();}}//账户classAccount{intmoney;//余额Stringname;//卡名publicAccount(intmoney,Stringname){this.moneymoney;this.namename;}}//银行:模拟取款classDrawingextendsThread{Accountaccount;//账户//取了多少钱intdrawingMoney;//现在手里有多少钱intnowMoney;publicDrawing(Accountaccount,intdrawingMoney,Stringname){super(name);this.accountaccount;this.drawingMoneydrawingMoney;this.nowMoneynowMoney;}//取钱Overridepublicvoidrun(){//判断有没有钱if(account.money-drawingMoney0){System.out.println(Thread.currentThread().getName()钱不够取不了);return;}//sleep可以放大问题的发生性try{Thread.sleep(1000);}catch(Exceptione){e.printStackTrace();}//卡内余额 金额-你取的钱account.moneyaccount.money-drawingMoney;//你手里的钱nowMoneynowMoneydrawingMoney;System.out.println(account.name余额为account.money);// Thread.currentThread().getName() this.getName()System.out.println(this.getName()手里的钱nowMoney);}}结果代码3packagecom.jiang.syn;importjava.sql.Array;importjava.util.ArrayList;importjava.util.List;//线程不安全的集合publicclassUnsafeList{publicstaticvoidmain(String[]args){ListStringlistnewArrayList();for(inti0;i10000;i){newThread(()-{list.add(Thread.currentThread().getName());}).start();}try{Thread.sleep(1000);}catch(Exceptione){e.printStackTrace();}System.out.println(list.size());}}结果