多线程基础之线程的生命周期(线程状态)
一个java线程从启动到结束运行,可能经历若干状态。
1.NEW(初始状态):一个已创建而未启动的线程处于该状态,由于一个线程只启动一次,所以只有一次处于该状态。
实现Runnable接口和继承Thread可以得到一个线程类,当这些类被new实例化之后,就属于初始状态。
2.RUNNABLE:该状态是一个复合状态。包括READY和RUNNING。前者表示该线程处于可以被线程调度器调度成RUNNING状态。后者表示该线程的run方法正在被
jvm虚拟机调用,通过yeild方法可以变为READY状态。
2.1 READY (就绪状态)
1.就绪状态只是说你资格运行,在没被调度程序调度之前,你就永远是就绪状态。
2.调用线程的start()方法,此线程进入就绪状态。
3.当前线程sleep()方法结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入就绪状态。
4.当前线程时间片用完了,调用当前线程的yield()方法,当前线程进入就绪状态。
5.锁池里的线程拿到对象锁后,进入就绪状态。
2.2 RUNNING(运行中状态)
线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。
3.BLOCKED(阻塞状态):一个线程发起一个阻塞式I/O操作后,或者被其它线程独占资源(比如锁),相应的线程会处于该状态,当线程重新获得资源后,又可以变为RUNNABLE.
4.WAITING(等待状态) : 一个线程执行了某些方法后就会处于这种等待状态。包括Object.wait(),Thread.join(),LockSupport.park(Object).
从WAITING变为RUNNABLE,Object.notify(),/notifyAll()和LockSupport.unPart(Object).
5.TIMED_WATING (超时等待): 不是无限期等待,带有时间限制,时间限制一到,不管如何,自动转为RUNNABLE
6.TERMINATED(终止状态): Thread.run()正常返回或抛出异常提前终止都会处于这个状态,只会保持一次,由于一个线程只启动一次