提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
上节我们讲解了Thread类的方法和属性:如开始一个线程的方法start(),中断一个线程interrupted()......等等,今天我们就将一下线程的几种状态吧。开始我们的正文吧。
一、线程的状态
前面我们已经说过了进程的状态分为:1.就绪。2.阻塞。
这是从操作系统的视角来看待的。Java线程也是对操作系统线程的分装,
针对状态这里,Java也进行了重新分装,进行表示。
因为线程的状态是一个枚举类型Thread.State,所以我们可以通过一段代码来进行展示Java线程所以的状态。
java
public class demo9 {
public static void main(String[] args) {
for (Thread.State state : Thread.State.values()){
System.out.println(state);
}
}
}

争对上述的线程状态,我们一个一个来进行讲解。
- NEW 安排了工作,还未开始行动 ,new了Thread对象,还没有start()
- TERMINATED 工作完成了。内核中的线程已经结束了,但是Thread对象还在
java
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
while (true) {
// 在这里啥都不做
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
System.out.println(t.getState());
t.start();
Thread.sleep(1000);
System.out.println(t.getState());
}

- RUNNABLE:可工作的,又可以分成正在工作中和即将开始工作。
在线程中就是**就绪状态:1)线程正在CPU上执行,**比如:我正在和一个A姐姐约会的这个状态。
2)线程随时可以去CPU上执行。A没有出差,她可以随叫随到的状态。

- BLOCKED、WAITING:这两个都表示排队等着其他事情。
- TIMED_WAITING:这和上面两个都表示排队等着其他事情。
但是能指定时间的阻塞,
线程阻塞(不参与cpu调度,不继续执行了,
阻塞的时间是有上限的。


本身也是一段cpu指令,一直循环执行,也是需要在cpu上运行的。

另外,join(时间)也是会进入到TIMED_WAITING状态

大家不要被这个状态转移图吓到,我们重点是要理解状态的意义以及各个状态的具体意思。


我们举个例子:我的导师给我安排了工作,但我只是接收了导师发的Email,我并没有开始工作,这是就是NEW线程 状态;当我的导师在教我在这个工作中做思维导图的时候,就是RUNNABLE ,当我开始上手做的时候就是RUNNING ,当我被导师叫去办公室的时候,就是进入BLOCKED、WAITING 、TIMED_WAITING 状态;当我将工作完成后就是TERMINATED状态。
二、使用代码来观察线程状态的转移和变化
1、观察NEW-RUNNABLE-TERMINATED变化
java
class Demo{
lic class demo9 {
public static void main(String[] args) {
Thread t = new Thread(()->{
for (int i = 0; i < 10; i++) {
}
},"南");
System.out.println(t.getName()+t.getState());
t.start();
while (t.isAlive()){
System.out.println(t.getName()+t.getState());
}
System.out.println(t.getName()+t.getState());
}
}
//运算结果:
//南NEW
//南RUNNABLE
//南RUNNABLE
//南RUNNABLE
//南RUNNABLE
//南RUNNABLE
//南RUNNABLE
//南TERMINATED
2.观察WAITING、BLOCKED、TIMED_WAITING的变化
java
class Demo {
public static void main(String[] args) {
Object locker = new Object();
Thread t = new Thread(()->{
synchronized (locker){
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
},"兴");
t.start();
Thread t2 = new Thread(()->{
synchronized (locker){
System.out.println("passion");
}
});
t2.start();
}
}
通过jconsole可以看到t1线程的状态事TIMED_WAITING,t2的状态事BLOCKED。


修改上⾯的代码, 把 t1 中的 sleep 换成 wait
java
class Demo {
public static void main(String[] args) {
Object locker = new Object();
Thread t = new Thread(()->{
synchronized (locker){
while (true){
try {
locker.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
},"苏");
t.start();
while (true){
System.out.println("passion");
}
}
}
通过jconsole可以看到t1的状态是WAITING。
结论:
- BLOCKED表示等待取锁,WAITING和TIMED_WAITING表示等待其他线程发来通知。
- TIMED_WAITING线程在等待唤醒,但设置了时间限制,WAITING线程就是在死等唤醒。
总结
今天我们学习了线程的几种状态,NEW--new了线程,但还没有开始运行;RUNNABLE--是线程在运行当中;BLOCKED--表示要等待锁被取走(开锁),才能被唤醒;WAITING--是死等;TIMED_WAITING是有时间限制的等待被唤醒。TERMINATED--线程已经完成了的状态。
今天的博客就到此结束了,谢谢各位佬的支持喜爱!!
下一节预告---线程安全问题(重点--面试高频考点)!!