在上一章节中咱们理解到线程怎么创立和执行。在理论开发过程中多线程是很容易呈现问题的,一不小心可能会导致死锁从而引起整个零碎解体。只有对线程的整个运行过程比拟理解能力及时地去找到问题在哪。不晓得大家有没有想过上面几个问题,
- 一共有哪些线程状态呢?
- 为什么要理解这些线程状态呢?
- 这些状态怎么查看呢?
我置信带着问题去学习是一种更高效的学习形式。接下来我会给小伙伴们一一找到答案。
上图是综合了线程个别状态和JVM中线程状态,其中红框期待timed_waiting、 期待waiting、阻塞blocked都是JVM的线程状态,JVM线程状态在JDK中有一个枚举类java.lang.Thread.State示意:
public enum State { /** * 线程还没有启动时的状态 */ NEW, /** * 可运行状态。 */ RUNNABLE, /** * 进入synchronized同步代码块 */ BLOCKED, /** * 执行以下办法进入WAITING状态 * Object.wait * Thread.join * LockSupport.park */ WAITING, /** * 执行以下带有工夫的办法进入TIMED_WAITING状态 * Thread.sleep(long) * Object.wait(long) * Thread.join(long) * LockSupport.parkNanos * LockSupport.parkUntil */ TIMED_WAITING, /** * 终止或者沦亡状态 */ TERMINATED; }
上面咱们通过代码和jstack命令演示下不同办法调用对一个的不同状态
- sleep(long)会使线程进入timed_waiting状态
/** * 调用sleep(long)线程处于timed_waiting状态 * * @author jinglei * @date 2020/8/21 13:09 */ public class TimedWaitingBySleep { public static void main(String[] args) { //1.sleep Thread sleepThread = new Thread(new Runnable() { @Override public void run() { System.out.println("调用sleep()之后线程处于timed_waiting状态"); try { Thread.currentThread().sleep(50000); } catch (InterruptedException e) { e.printStackTrace(); } } }); sleepThread.setName("mythread-sleep"); //启动线程 sleepThread.start(); } }
运行程序,而后通过jps命令找到对应的过程id,再用jstack processId > D:/test/sleepTimedWaiting.log把线程堆栈输入到文件
文件内容如下图
能够看出mythread-sleep这个线程处于java.lang.Thread.State: TIMED_WAITING (sleeping)这个状态。