线程的状态和启停
状态
线程的状态分别为:
new
在新建后的线程,状态就会变成new,比如
new Thread(()->{
System.out.println("i am print");
});
//或者实现runnable接口,其实Thread就实现了runnable接口
runnable
当调用了线程的.start()方法时,就处于待执行的状态
terminate
当线程执行完毕后,处于终止状态,可以根据
Thread.currentThread().isAlive()
来判断线程是否存活
blocked
当线程存在锁竞争时,被阻塞的线程就会处于blocked状态。测试代码如下
new Thread(()->{
synchronized (ThreadStateDemo.class){
try {
TimeUnit.SECONDS.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"getSyn1").start();
new Thread(()->{
synchronized ((ThreadStateDemo.class)){
try{
System.out.println("123");
}catch (Exception e){
e.printStackTrace();
}
}
},"blockthread1").start();
在控制台调用jps获取到当前运行的pid后,调用jstack指令,可以看到线程目前的状态,代码中给线程命名是为了在调用jstack指令时,明确知道是哪个线程处于何种状态。
waiting
顾名思义,处于该状态即通过调用wait方法
new Thread(()->{
try {
ThreadStateDemo.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
time_waiting
有时间限制的等待,可以通过sleep和wait(mills)方法。
启停
启动线程我们都是用start方法,但是为啥我们复写的是run方法?
在java源代码中,调用start方法的底层使用的是native方法,通过观察native方法的源码发现,启动方法调用的是run方法。
关于线程的停止,api里面有suspend、stop、interrupt、抛异常等方法,但是suspend和stop是被设置成失效方法的,因为这种停止会让线程无法及时的释放资源从而导致工作状态的不稳定。一般我们使用的都是interrupt方法,其实现原理是在run方法设计中,通过一个标志位来确定是否执行run方法体,然后通过另外的条件出发把标志位设置成false。

本文介绍了Java中线程的六种状态,包括new、runnable、terminated、blocked、waiting和timed_waiting,并详细解析了状态转换。此外,讨论了线程的启动,指出start方法实际上调用了run方法的native实现。对于线程的停止,文章建议使用interrupt方法,避免使用已废弃的suspend和stop方法,以确保资源的及时释放和系统稳定性。
999

被折叠的 条评论
为什么被折叠?



