“苦? 何止是苦~~~~~”
本期内容来分享一下线程状态相关的知识哦!!!
对于进程来说,进程是有两种状态的。
一种是就绪状态:正在CPU上执行,或者随时可以去CPU上执行的。
另一种是阻塞状态:暂时不能去CPU上执行的。
那么对于线程来说,线程也是有状态的,而且更加详细的分了六中状态,那么接下来,我们一起来了分别了解这六中状态吧。
状态一:新建(New)
对于NEW状态来说,虽然当前创建出了一个thread对象,但是内核的线程还没有(还没有调用start方法),没有在内核中真正创建出thread对象的(只有在调用start()方法之后,内核才会真正创建出线程)。
状态二:可运行(RUNNABLE)
该状态表示线程正在CPU上运行,或者随时可以去CPU上运行。
状态三:阻塞(Blocked)
该状态是由线程之间由于锁竞争锁引起的阻塞状态。
public class Demo3 {
private static Object locker1 = new Object();
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
synchronized(locker1) {
while(true) {
}
}
},"t1");
Thread t2 = new Thread(() -> {
synchronized (locker1) {
System.out.println("------");
}
},"t2");
t1.start();
//确保t1执行
sleep(100);
t2.start();
}
}
这个我们可以借助idk下的一个工具进行查看。首先先找到jdk所在的路径,然后点到bin目录下面去,然后找到jconsole.exe,运行jconsole,(在运行jconsole时,确保你的程序在运行着),然后选择本地进程里面的,你所运行着的代码文件名。之后点击连接,然后点击不安全连接,之后再点到线程那一栏,找到你的线程的名称,点进去就可以看见它的信息了。
那么上面我们看到,线程t2是一个BLOCKED状态,t1线程正在运行着,就是RUNNABLE。
那么这个工具也是我们之后如果遇到线程之类的一些问题,可以利用这个工具来查看线程的状态,这样便于我们检查或者排除一些问题。
状态四:等待(WAITING)
没有超时时间的等待,由join/wait等引起的一种状态。
状态五: 定时等待(TIME_WAITING)
有超时时间的等待,比如sleep或者join(带参数版本)
状态六:终止(TERMINATED)
当前Thread对象虽然还在,但是内核的线程已经销毁了(线程已经结束了)
下面假设一堆人去银行办理业务为例,有一个更清晰的了解:
相信大家看见这个图之后,有了多一些了解,了解线程的这六种状态,对于后续的多线程编程会有一定帮助的。
"感谢你阅读这篇文章!如果你觉得这篇文章对你有帮助,请分享给你的朋友。同时,欢迎在下方留言,告诉我你的想法或提出任何问题。"
好了,本期节目就到这里了,我们下期节目不见不散。