线程状态
java线程的几种状态
- NEW:Thread对象已经创建出来,但是系统内核线程还没有创建
- RUNNABLE:线程已经创建,开始运行
- WATING:线程等待状态 (线程阻塞等待状态)
- TIMED_WATING:线程等待状态 (线程休眠状态)
- BLOCKED:线程等待状态(线程加锁阻塞状态)
- TERMINATED:Thread对象已经回收,线程已经销毁
TIMED_WATING、BLOCKED、WATING状态都是线程等待状态但是造成各自等待的原因不同
//线程状态
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
//t开始工作之前,得到NEW状态
System.out.println(t.getState());
t.start();
// Thread.sleep(100); //得到TIMED_WATING状态
//t开始工作之后,得到RUNNABLE状态
System.out.println(t.getState());
t.join();
//t结束工作,得到TERMINATED状态
System.out.println(t.getState());
}
}
线程的状态转化
结论:BLOCKED是等待获取锁,WATING、TIMED_WATING是等待其它线程发来通知
WATING表示无线等待、TIMED_WATING表示等待唤醒但设置了时限。
通过jconsole查询线程状态
按如下代码进行举例
class MyThread3 extends Thread{
@Override
public void run() {
while(true){
System.out.println("hello thread");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Demo9 {
public static void main(String[] args) throws InterruptedException {
MyThread3 t = new MyThread3();
t.start();
t.join();
while(true){
System.out.println("hello main");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
- 启动线程
- 打开你jdk所在的位置,找到bin目录下的jconsole应用程序
- 双击进去,点连接你当前运行的线程所在类
4. - 不安全连接,放心点
- 然后查看线程,main代表你主线程,Thread-0是你创建的线程,你不取名的默认线程名
可以看到main线程是在无限时常等待Thread-0线程的,所以它是WATING状态。