线程的五大状态
新生状态
new一个实现类对象(实现多线程接口)--->一旦创建就会有工作空间,工作空间与主存进行交互
就绪状态
-
调用star方法进入
-
阻塞事件接触以后回到就绪状态而不是直接进入运行状态
-
运行中让出cpu的资源yield直接进入继续--->yield方法线程不进入阻塞
-
jvm从本地线程切换其他线程
运行状态
running我们无法控制,由cpu去控制。所以就绪状态和运行状态统称runnable
阻塞状态
-
sleep
-
sleep的细分本质是--->timewait
-
-
join
-
wait--->线程状态内部对阻塞进行区分
-
wait的细分本质是--->broke
-
-
read、write
死亡状态
terminated
Thread.state类--->该类是个枚举类(Enum)
该类下对线程的状态做了细分:
-
NEW--->创建一个线程对象
-
RUNNABLE--->调用start方法或者运行中
-
BLOCKED--->遇到阻塞(IO操作、JUC当中的锁定)
-
WAITING--->(sleep、join这样的成为waiting)
-
TIMED_WAITING--->(给了时间)
-
TERMINATED
线程状态的细分
-
新生状态
-
就绪和运行状态
-
就绪和运行
-
-
阻塞状态
-
锁定--->BLOCKED
-
等待--->waiting
-
有时间的等待--->time_waiting
-
-
结束、死亡状态
通过Thread类当中的getState方法查看线程状态,并通过Thread.State.TERMINATED方法结束查看
package iostudy.threadstate;
import javax.swing.plaf.nimbus.State;
/**
* 观察线程状态类--->Thread.state类里面由具体的状态分类
* 要时刻注意sleep、join和yield的区别
* @since JDK 1.8
* @date 2021/6/7
* @author Lucifer
*/
public class AllState {
/**
* 新建线程对象
* 观察线程状态
* @param args
*/
public static void main(String[] args) {
Thread t = new Thread(() -> {
for (int i = 0; i < 5; i++){
try {
/*线程等待*/
Thread.sleep(100); //Time_Waiting阻塞
}catch (InterruptedException e){
System.out.println(e.getMessage());
e.printStackTrace();
}
System.out.println("Lucifer!!!");
}
});
/*调用getState方法观察状态--->Thread类下的方法*/
Thread.State state = t.getState();
/*打印具体的状态*/
System.out.println(state); //在这里打印的线程处于新生状态--->NEW状态
/*让线程变成就绪状态*/
t.start();
state = t.getState(); //Runnable状态
System.out.println(state);
/*让线程进入阻塞状态--->听过死循环监视*/
/*调用自身方法让线程停止*/
while (state != Thread.State.TERMINATED){
/*500毫秒监控一次*/
try {
/*线程等待时间*/
Thread.sleep(500);
}catch (InterruptedException e){
System.out.println(e.getMessage());
e.printStackTrace();
}
state = t.getState(); //Time_Waiting状态
System.out.println(state);
}
/*查看最后一次的线程状态*/
state = t.getState();
System.out.println(state);
}
}
因为最终活动的线程数仅存一个主线程,所以可以通过活动的线程数量来判断停止
package iostudy.threadstate;
import javax.swing.plaf.nimbus.State;
/**
* 观察线程状态类--->Thread.state类里面由具体的状态分类
* 要时刻注意sleep、join和yield的区别
* @since JDK 1.8
* @date 2021/6/7
* @author Lucifer
*/
public class AllState {
/**
* 新建线程对象
* 观察线程状态
* @param args
*/
public static void main(String[] args) {
Thread t = new Thread(() -> {
for (int i = 0; i < 5; i++){
try {
/*线程等待*/
Thread.sleep(100); //Time_Waiting阻塞
}catch (InterruptedException e){
System.out.println(e.getMessage());
e.printStackTrace();
}
System.out.println("Lucifer!!!");
}
});
/*调用getState方法观察状态--->Thread类下的方法*/
Thread.State state = t.getState();
/*打印具体的状态*/
System.out.println(state); //在这里打印的线程处于新生状态--->NEW状态
/*让线程变成就绪状态*/
t.start();
state = t.getState(); //Runnable状态
System.out.println(state);
/*
因为线程中有活动的线程数
可以通过线程数来控制结束
因为最终的线程数会由很多变成一个主线程,所以可以通过这个线程数量来控制
*/
while (true){
/*调用Thread类里面一个记录线程数的方法*/
//活动的线程数
int num = Thread.activeCount();
if (num == 1){
break;
}
/*500毫秒监控一次*/
try {
/*线程等待时间*/
Thread.sleep(500);
}catch (InterruptedException e){
System.out.println(e.getMessage());
e.printStackTrace();
}
state = t.getState(); //Time_Waiting状态
System.out.println(state);
}
}
}
重点观察的线程状态
根据Thread.state类里面的对线程状态的划分:
-
new
-
runnable
-
running
-
blocked
-
waiting
-
time_waiting
-
block
-
-
terminated
重点关注阻塞以及结束--->sleep、join、yield和自己编写的方法停止线程