在上一章节中咱们理解到线程怎么创立和执行。在理论开发过程中多线程是很容易呈现问题的,一不小心可能会导致死锁从而引起整个零碎解体。只有对线程的整个运行过程比拟理解能力及时地去找到问题在哪。不晓得大家有没有想过上面几个问题,
- 一共有哪些线程状态呢?
- 为什么要理解这些线程状态呢?
- 这些状态怎么查看呢?
我置信带着问题去学习是一种更高效的学习形式。接下来我会给小伙伴们一一找到答案。
上图是综合了线程个别状态和 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)这个状态。