线程一共有几种状态呢?
线程状态 |
导致状态发生条件 |
NEW(新建) |
线程被创建后,没有启动,即没有调用start方法 |
Runnable(可运行) |
正在 Java 虚拟机中执行的线程 |
Blocked(锁阻塞) |
线程想获取一个锁对象,但该锁对象被其他线程持有了,该线程就进入了阻塞状态;当该线程获取了锁对象后就进入Runnable状态 |
Waiting(无限等待) |
等待另外一个线程执行一个唤醒操作的线程处于这种状态。处于Waiting状态的线程不能自动唤醒,需等待其他的线程执行notify()或notifyAll()方法才会唤醒处于Waiting状态的线程。 |
TimedWaiting(计时等待) |
等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态。这一状态 将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep 、Object.wait。 |
Teminated(被终止) |
已退出的线程处于这种状态 |
状态之间的关系转化:
发现处于计时等待状态的线程,sleep()只要时间到了,不用获取锁对象就能直接进入Runnable状态;而wait时间到了,还需考虑是否获取锁对象。
原因是sleep()并没有释放锁对象,而wait()会释放锁对象。
原文:https://www.cnblogs.com/chunxiaoxi/p/15059410.html