文章目录
一、线程的状态
NEW:线程只是创建了Thread对象,并没有开始执行线程
TERMINATED:线程已经执行完了,但是Thread对象还在
RUNNABLE:就绪的,分为两个,一个是就绪状态,另一个是正在运行中这两种都RUNNABLE
TIMED_WAITING:指定时间,超时等待(使用sleep方法时)
BLOCKED:阻塞,等待锁的出现
WAITING:等待,一直等待到特定方法,wait等
二、状态图
三、各种状态的展现
public class ThreadDemo3 {
public static void main(String[] args) {
Thread t = new Thread(() -> {
for (int i = 0; i < 10; i++) {
}
}, "张三");
System.out.println(t.getName() + ": " + t.getState()); //在线程还没创建出来,Thread已经创建出来打印状态
t.start();
while (t.isAlive()) {
System.out.println(t.getName() + ": " + t.getState()); //在线程还存活的时候打印状态
}
System.out.println(t.getName() + ": " + t.getState()); //线程已经结束后,获取状态
}
}
可以看到此时的状态:
在线程创建出来还没执行前为NEW
线程在运行的时候为RUNNABLE
在线程运行完后为TERMINATED
public class ThreadDemo4 {
public static void main(String[] args) {
final Object object=new Object();
Thread t1=new Thread(()->{
synchronized (object){
while (true){
try {
Thread.sleep(1000); //让线程进入睡眠等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
},"t1");
t1.start();
Thread t2=new Thread(()->{
synchronized (object){ //线程等待锁
System.out.println("haha");
}
},"t2");
t2.start();
}
}
此时可以在jconsole.exe观察线程的状态
t1的状态就为TIMED_WAITING
t2的状态为BLOCKED
将上面的sleep改为wait就可以看到
状态为WAITING
总结
本文简单介绍了进程的几种状态和相互之间的转换,展示线程在java的状态