Java线程状态有几个?Java线程状态是如何转换?Java线程状态转换什么情况会进入锁的等待队列?Java线程状态转换什么情况会进入锁的同步队列?
一提到Java线程状态,不少读者立马想到线程状态转换图,但细想,印象又不深刻,只记得有那么几个状态。再要你说出Java线程状态是如何转换的,脑子里可能就如下图一样,已经是一团浆糊了。
新建状态(New)我们可以通过实现Runnable接口或继承Thread声明一个线程类,new一个实例后,线程就进入了新建状态。一个刚诞生的线程,处于新建状态。
就绪状态(Ready)线程对象创建成功后,调用该线程的start()函数,线程进入就绪状态,该状态的线程进入可运行线程池中,等待获取C P U的使用权。
运行状态(Running)
此时线程调度程序正在从可运行线程池中选择一个线程,该线程进入运行状态。换句话说,线程获取到了C P U时间片。还没完呢,当线程时间片用完或调用的yield()函数,该线程回到就绪状态。作为一名运气好的线程,我进入了运行状态,但是运气用完了,我还得回到就绪状态。
终止状态(Terminated)线程继续运行,直到执行结束或执行过程中因异常意外终止都会使线程进入终止状态。线程一旦终止,就不能复生,这是不可逆的过程。
等待状态(Waiting)运行状态的线程执行wait()、join()、LockSupport.park()任意函数,该线程进入等待状态。其中wait()与join()函数会让J V M把该线程放入锁等待队列。处于这种状态的线程不会被分配C P U执行时间,它们要等待被主动唤醒,否则会一直处于等待状态。如果我们要唤醒线程怎么办呢?执行LockSupport.unpark(t)函数唤醒指定线程,该线程回到就绪状态。而通过notify()、notifyAll()、join线程执行完毕方式,会唤醒锁等待队列的线程,出队的线程回到就绪状态。
超时等待状态(Timed waiting)超时等待与等待状态一样,唯一的区别就是多了超时机制,不会一直等待被其他线程主动唤醒,而是到达指定时间后会自动唤醒。以下函数会触发进入超时等待状态wait(long)join(long)LockSupport.parkNanos(long)LockSupport.parkUtil(long)sleep(long)其中wait(long)、join(long)函数会让J V M把线程放入锁等待队列。后面的唤醒剧情就和等待状态如出一辙,就多了超时时间到了,自动唤醒的动作。
阻塞状态(Blocked)运行状态的线程获取同步锁失败或发出I/O请求,该线程进入阻塞状态。如果是获取同步锁失败J V M还会把该线程放入锁的同步队列。
同步锁被释放时,锁的同步队列会出队所有线程,进入就绪状态。I/O处理完毕时,该线程重新回到就绪状态。
更多最新最全java面试学习资料(持续更新中。。。):
https://pan.quark.cn/s/236eda5a3dc2