线程的生命周期?
线程的生命周期分为五个部分:新建状态、就绪状态、运行状态、阻塞状态、死亡状态。
新建状态(new):指新建了一个线程对象。比如 Thread t= new Thread( ); 这就是新建了一个Thread类的线程对象。
就绪状态(ready):当线程对象创建后,该线程对象自身或其他对象调用了该对象的start() 方法。该线程就位于可运行池中,变得可运行,等待获取cpu的使用权。因为同一时间里CPU只执行某一个线程。
运行状态(Running):当就绪状态的线程获取了CPU的时间片或者说获取了CPU的执行时间,这就调用该线程的run()方法,然后进入到运行状态。只有处于就绪状态的线程才能进入运行状态。
阻塞状态(Blocked):一个正在执行的线程在一些情况下,如执行耗时的输入输出操作时,会放弃CPU的使用权,进入阻塞状态。线程进入阻塞状态后,不能再排队队列,必须消除阻塞,才可以进入就绪状态。不能直接进入运行状态,即结束阻塞的线程需要重新进入运行池,等待系统的调度。
进入阻塞状态的几种情况:
————当线程试图获取某个对象的同步锁时,如果该锁被其他线程所使用,则该线程会进入阻塞状态。想消除此状态,必须获得到其他线程所持有的锁。
————当线程调用一个阻塞试的IO方法时。想进入就绪状态,必须等到这个阻塞的IO的方法返回。
————当线程调用了某个对象的wait()方法时。notify()方法唤醒。
————调用了Thread.sleep(long millis)方法时。休眠状态自动进入阻塞状态。
————一个线程调用另一个线程join()方法时。等待加入的线程运行结束后会结束阻塞状态。
死亡状态(Dead):当线程执行完或者异常退出了run()的执行,则该线程的生命周期就结束了
参考:(https://blog.csdn.net/evankaka/article/details/44153709#t3)