含义 | 是否存活 | 是否可以占有 CPU 是否可以自动解除阻塞 | 已占有CPU | 涉及到的池 | 说明 | |
---|---|---|---|---|---|---|
New | 新建 | √ | × | × | - | 刚刚创建,尚未 start() |
Runnable | 就绪 | √ | √ | × | 可运行线程池 | 已 start() ,等待获取 CPU 使用权 |
Running | 运行 | √ | √ | √ | - | |
Blocked | 阻塞 | √ | × | × | - | 放弃 CPU 使用权 |
等待阻塞 | √ | × | × | 等待池 | 已 wait() | |
同步阻塞 | √ | √ | × | 锁池 | 抢锁没抢到,等待锁释放 | |
其他阻塞 | √ | √ | × | - | 已 sleep() 、join() 、IO 等 | |
Dead | 死亡 | × | × | × | - | 完成或异常 |
区别
CPU 处于的状态不同
CPU 状态的不同,影响 CPU 执行指令的权限
为什么会划分用户态、内核态
什么时候发生用户态、内核态的切换
下面场景线程会切换至内核态,但本质上将下列情况都是 中断
推荐的停止线程的方式
示例代码(通过中断:先中断,处理中断时停止)
public void run(){
while(true){
if(Thread.currentThread().isInterrupted()){
//结束线程
return;
}
try{
//do sth
Thread.sleep(2000);
}catch(InterruptedException e){
//结束线程
return;
}
}
}
Thread.stop
、Thread.suspend
、Thread.resume
都过期了Thread.interrupt
仅将线程的中断标志位置为 true,推荐的停止线程的方式中断方法
Thread.interrupt)
中断方法,但作用仅限于设置标志位Thread.interrupted()
静态方法,判断当前线程是否被中断,然后将中断标志位清除Thread.isInterrupted()
,实例方法,判断当前线程是否被中断子线程的停止
synchronized 锁:
线程:
Lock(Condition):
BlockingQueue: