1.线程状态的种类
- NEW:Thread 对象有了,调用 start系统内部的线程还未创建。
- RUNNABLE:指的是,这个线程"随叫随到"。
a)这个线程正在 CPU 上执行
b)这个线程虽然没在 CPU 上执行,随时可以调度到 CPU 上执行 - BLOCKED:进行锁竞争的时候产生的阻塞(本文暂不涉及)
- WAITING:死等进入阻塞状态
- TIMED_WAITING:超时等待进入阻塞状态
- TERMINATED:线程已经终止了(内核中的线程已经销毁了,Thread 对象还在)
2.线程每种状态之间的关系
1.NEW状态
public static void main(String[] args) {
Thread t=new Thread(()->{
System.out.println("tjchs");
});
System.out.println(t.getState());
t.start();
}
2.RUNNABLE状态
还是原来那个代码,只不过多加了一行,运行结果就不一样了
public static void main(String[] args) throws InterruptedException {
Thread t=new Thread(()->{
System.out.println("tjchs");
});
System.out.println(t.getState());
t.start();
System.out.println(t.getState());
}
可以看到t线程start之前其实有个RUNNALE状态,然后立马就执行了。(就像是跑步比赛,开跑前都要处于一个起跑的就绪状态,信号枪一响就立马跑起来)
3.TERMINATED状态
在上个代码的基础上加了个t.join(为了保证t线程已经执行完),可以看到线程处于TERMINATED(终止)状态。
public static void main(String[] args) throws InterruptedException {
Thread t=new Thread(()->{
System.out.println("tjchs");
});
System.out.println(t.getState());
t.start();
t.join();
System.out.println(t.getState());
}
4. WAITING状态
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
while (true) {
System.out.println("tjchs");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
t.join();
}
这个状态从代码结果不是很好看出来,需要借助jconsole这个工具来看
如何通过jconsole看线程状态:
1.根据路径找到jconsole.exe
2.选择当前运行的线程,然后点连接
3.会出现一个新的框,点击 不安全的连接
4.选择线程,点击main可看到当前线程状态的文字描述
可以看到这个
此时线程处于WAITING(死等)状态
5. TIMED_WAITING状态
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
while (true) {
System.out.println("tjchs");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
t.join(3600*1000);
}
重复之前的步骤,可以看到此时线程处于TIMED_WAITING状态
总结:
线程之间每种状态的关系大致如此