当前位置: 首页 > 后端技术 > Java

Java线程状态详解

时间:2023-04-01 21:13:16 Java

Java中每个线程都有自己的状态。Thread类中的成员变量threadStatus保存了线程的状态:privatevolatileintthreadStatus=0;Thread类中也定义了state的枚举,一共有6种,如下:publicenumState{NEW,//新状态RUNNABLE,//执行状态BLOCKED,//阻塞状态WAITING,//无限期等待stateTIMED_WAITING,//有限的等待状态TERMINATED;//退出状态}threadStatus的初始值为0,对应NEW状态。NEW:new状态,newThread()就是这个状态,此时线程还没有开始执行RUNNABLE:执行状态,调用start方法的时候,线程就是这个状态,当然CPU可能BLOCKED:阻塞状态,等待锁时线程处于该状态WAITING:无限期等待,需要唤醒的等待属于该状态,如期间,调用一些有超时时间的等待方法就会进入这个状态,比如Thread.sleep,Object.wait,Thread.join,Lock.tryLock,Condition.awaitTERMINATED:退出状态,可能是正常操作完成,也可能是抛出异常导致线程终止。我们可以通过getState获取线程的状态:Statestate=thread.getState();下面我们通过一个例子来感受一下线程状态的变化。示例1:Threadt=newThread(()->{System.out.println("sleep");//休眠2秒ThreadUtil.sleep(2000);System.out.println("run");});//启动前打印线程状态System.out.println(t.getState());//启动线程t.start();//启动后立即打印一次线程状态System.out.println(t.getState());//每500毫秒打印一次线程状态while(true){ThreadUtil.sleep(500);System.out.println(t.getState());}Output:NEWRUNNABLEsleepTIMED_WAITINGTIMED_WAITINGTIMED_WAITINGrunTERMINATEDTERMINATEDTERMINATEDTERMINATEDTERMINATEDTERMINATEDTERMINATE可以看出创建线程后,初始状态为NEW;调用start方法后,状态变为RUNNABLE;线程中执行sleep时,休眠2秒,状态变为TIMED_WAITING;当线程执行完成时,状态变为TERMINATED。例子2:这个例子演示了多个线程竞争锁时线程状态的变化。私有静态对象锁=新对象();publicstaticvoidmain(String[]args){Runnablerunnable=()->{//锁定同步(lock){System.out.println(Thread.currentThread().getName()+"lock");ThreadUtil.sleep(2000);}System.out.println(Thread.currentThread().getName()+"退出");};Threadt1=newThread(runnable,"t1");Threadt2=newThread(runnable,"t2");t1.开始();t2.开始();while(true){ThreadUtil.sleep(500);System.out.println(t1.getName()+":"+t1.getState());System.out.println(t2.getName()+":"+t2.getState());}}output:t1lockt1获取锁t1:TIMED_WAITINGt1睡眠,进入有限等待状态t2:BLOCKEDt2还没有获取锁,所以进入阻塞状态t1:TIMED_WAITINGt2:BLOCKEDt1:TIMED_WAITINGt2:BLOCKEDt1exitt1释放锁,执行完成,退出t2lockt2获得锁t1:TERMINATEDt1已经处于退出状态t2:TIMED_WAITINGt2休眠,进入有限等待状态t1:TERMINATEDt2:TIMED_WAITINGt1:TERMINATEDt2:TIMED_WAITINGt1:TERMINATEDt2:TIMED_WAITINGt2exitt2释放锁,执行完成,exitt1:TERMINATEDt1为退出状态t2:TERMINATEDt2为退出状态示例3:本示例演示线程如何进入和退出WAITING状态私人静态对象对象=新对象();publicstaticvoidmain(String[]args){Runnablerunnable=()->{synchronized(obj){try{//等待obj.wait();}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("退出");}};Threadt1=newThread(runnable,"t1");System.out.println(t1.getName()+":"+t1.getState());t1.开始();System.out.println(t1.getName()+":"+t1.getState());对于(inti=0;i<20;i++){ThreadUtil.sleep(500);if(i==3){synchronized(obj){//唤醒obj.notify();}}System.out.println(t1.getName()+":"+t1.getState());}}输出:t1:NEWt1:RUNNABLEt1:WAITING调用obj.wait()进入无限等待状态t1:WAITINGt1:WAITINGt1:BLOCKED主线程获取锁并执行notify,t1进入阻塞状态stateexitt1线程退出同步块,执行完成状态,但它与操作系统的线程状态有对应关系。以后有必要深入分析操作系统原理和热点源码。

最新推荐
猜你喜欢