📚博客主页:爱敲代码的小杨.
✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》
❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️
🙏小杨水平有限,欢迎各位大佬指点,相互学习进步!
文章目录
- 1. 线程状态的分类
- 2. 线程状态代码演示
- 3. 线程状态转化
1. 线程状态的分类
NEW
(新建):Thread
对象有了, 但是还没有启动线程RUNNABLE
(可运行): 线程在Java虚拟机中执行时处于此状态。这个线程可能正在CPU上执行, 这个线程可能没在CPU上执行, 随时可以调度到 CPU 上执行TERMINATED
(终止): 线程已经终止了, 内核中的线程已经销毁了WAITING
(等待):当线程在等待另一个线程执行特定动作(不带超时)时,线程处于此状态。TIMED_WAITING
(计时等待):与WAITING
状态类似,但是等待有一个超时时间。BLOCKED
(阻塞):当线程试图进入synchronized
锁定的代码块或方法时,而锁被其他线程持有时,线程将进入BLOCKED
状态。
2. 线程状态代码演示
使用getState
得到线程的状态
NEW
(新建):
public class demo22 {
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
System.out.println("hello t1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
System.out.println("t1 线程的状态: " + t1.getState());
}
}
运行结果:
RUNNABLE
(可运行):
public class demo22 {
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
System.out.println("hello t1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
t1.start();
System.out.println("t1 线程的状态: " + t1.getState());
}
}
TERMINATED
(终止):
public class demo22 {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
System.out.println("hello t1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
t1.start();
// 等待t1线程执行结束
t1.join();
System.out.println("t1 线程的状态: " + t1.getState());
}
}
运行结果:
WAITING
(等待):
public class demo22 {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
while (true) {
System.out.println("hello t1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
t1.start();
t1.join();
}
}
由于 idea 中打印不好观察 WAITING
, 我们使用jconsole
工具来观察线程状态
jconsole
:在 jdk 安装目录下的 bin 文件夹中
运行结果:
TIMED_WAITING
(计时等待)
public class demo22 {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
while (true) {
System.out.println("hello t1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
t1.start();
t1.join(3600 * 100);
}
}
3. 线程状态转化
举例:
小杨和小美要去买肯德基, 还没有去, 就是NEW
状态
当小杨和小美开始去窗口排队,等待服务,就进入RUNNABLE
状态 ;该状态并不表示已经被肯德稽开始接待,排在队伍中也是属于该状态,即可被服务的状态,是否开始服务,则看调度器的调度;
当小杨和小美因为一些事需要去忙, 例如:考虑吃什么?..这时候就进入了BLOCKED
,WATING
,TIMD_WATING
状态
当小杨和小美都买完了肯德基为TREMINATED
状态