✨个人主页: 不漫游-CSDN博客
前言
之前在讲进程的时候提到进程有就绪和阻塞状态--->http://t.csdnimg.cn/p2cd0
接下来咱们就细究线程的状态~
6种状态
NEW
线程刚被创建,但尚未启动。即线程对象已经实例化,但还没有调用 start() 方法。
TERMINATED
线程已经完成执行。尽管Thread对象还在,但线程已经结束了。
RUNNABLE
和进程中的就绪状态一样,线程此时在CPU上运行或者随时都可以去CPU上运行。
WAITING
线程在等待另一个线程执行特定的动作。
例如通过调用 Object.wait()、Thread.join() 。没有参数就要被等的线程执行结束才行。不然就一直阻塞等待。
TIMED_WAITING
线程在等待另一个线程执行特定的动作,但有一个超时时间。
例如,通过调用 Thread.sleep(long)、Object.wait(long)、Thread.join(long)。有参数的就不会死等了。
BLOCKED
因为线程 对于 锁 的竞争引起的堵塞。
获取状态
对于以上的状态的获取,可以调用Thread 类中的 getState() 方法去获取。如图~
public class demo14 {
public static void main(String[] args) {
//创建一个线程
Thread thread = new Thread(() -> {
try {
//让线程休眠一段时间
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println("线程状态: " + thread.getState());
//启动线程
thread.start();
//打印线程的状态
System.out.println("线程状态: " + thread.getState());
try {
//主线程休眠一段时间,以便观察线程状态的变化
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//再次打印线程的状态
System.out.println("线程状态: " + thread.getState());
try {
//等待线程结束
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
//再次打印线程的状态
System.out.println("线程状态: " + thread.getState());
}
}
创建了Thread对象但没start(),所以是NEW.
一旦开始start,便是RUNNABLE .
而后调用sleep 去休眠,有参数的就是规定了等待时间的,便是TIMED_WAITTING.
最后进程结束,也对着TERMINATED.
当然也可以通过jconsole来查看 Java程序的详细信息。
可以从命令行(直接输入jconsole)或在 jdk文件包中bin目录中找到并运行。
状态之间的转换
NEW → RUNNABLE
当调用 start() 方法时,很明显,线程从 NEW 状态转换到 RUNNABLE 状态。
RUNNABLE → BLOCKED
当线程试图进入一个被其他线程占用的同步块(上锁)时,它会从 RUNNABLE 状态转换到 BLOCKED 状态。(后续重点讲这个~)
RUNNABLE → WAITING
当线程调用 Object.wait()、Thread.join() 时,它会从 RUNNABLE 状态转换到 WAITING 状态。
RUNNABLE → TIMED_WAITING
当线程调用 Thread.sleep(long)、Object.wait(long)、Thread.join(long) 时,它会从 RUNNABLE 状态转换到 TIMED_WAITING 状态。
BLOCKED/WAITING/TIMED_WAITING → RUNNABLE
当线程获取到对应的锁、被其他线程通知或超时时间到达时,它会从 BLOCKED、WAITING 或 TIMED_WAITING 状态转换到 RUNNABLE 状态。
RUNNABLE → TERMINATED
当线程的 run() 方法正常结束即线程结束时,它会从 RUNNABLE 状态转换到 TERMINATED 状态。
符合各种状态的特点就好确定转换条件啦~
看到最后,如果觉得文章写得还不错,希望可以给我点个小小的赞,您的支持是我更新的最大动力