上面这张图是线程的几种状态情况,可能会看的有一些乱 , 所以我们将线程状态简化一下,得到下面这张图
线程的六大状态
NEW 状态
此时线程已经被创建(NEW) ,但还没有被调用的情况
Thread t = new Thread(() -> {
});
//没有启动
System.out.println(t.getState()); //NEW
此时线程的状态就是NEW.
RUNNABLE 状态
此时线程已经创建好(NEW), 并且已经启动, 此时线程正在快速执行任务(RUNNABLE), 并且还没有得到释放
//注意TERMINATED 和 NEW 是Java内部搞出来的 和PCB中的状态没有啥关系
Thread t3 = new Thread(() -> {
while (true) {
//程序快速执行
}
});
t3.start();
Thread.sleep(1000);
//如果代码中没有进行Sleep 也没有进行其他的可能导致阻塞的操作,代码大概率是处在Runnable状态的,
//因为创建线程也需要时间,可能获取线程状态的是时候,线程并没有走到预期的位置.
System.out.println(t3.getState()); //RUNNABLE
TIMED_WAITING 状态
此时线程进入阻塞状态, 通常这种状态都是有等待时间的(TIMED_WAITING) 当线程执行完sleep操作之后, 如果该线程不再休眠, 那么就会进入RUNNABLE状态 , 直到线程执行完任务.
Thread t4 = new Thread(() -> {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t4.start();
Thread.sleep(1000);
//join 也属于阻塞状态只是到了一定时间之后阻塞状态解除
System.out.println(t4.getState());// TIMED_WAITING
TERMINATED 结束态
当线程已经创建好(NEW),并且任务已经执行完毕(RANNABLE),但是并没有得到资源的释放(TEWMINATED).
Thread t2 = new Thread(() -> {
});
t2.start();
t2.sleep(1000);
//线程已经执行完毕 但是进程还没销毁 为了得到这个状态给sleep一秒的延迟让他仍然存在.
System.out.println(t2.getState());//TERMINATED
WAITING 阻塞态
该状态也是一种阻塞态 , 不过跟TIMED_WAITING不一样的是, 该阻塞没有时间限制 , 如果没有线程调用notify() 方法, 那么waiting状态的线程会一直阻塞下去
Thread t5 = new Thread(() -> {
while (true) {
synchronized (locker) {
synchronized (locker2) {
try {
locker.wait();
Thread.sleep(10_0000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
});
t5.start();
Thread.sleep(1000);
System.out.println(t5.getState());
但是注意: wait () 方法需要搭配锁来进行使用, 当线程被notify 唤醒之后, 就会进入RUNABLE状态 正常进行工作.
BLCOKED阻塞态
该状态说明线程正在进行抢锁操作, 因为唯一的一把锁已经被其他线程占用了,(也就是上述线程的t5 抢占了 locker2 锁, 因此 t6 进程正在不断地抢锁操作.) 从而进入阻塞态
Thread t5 = new Thread(() -> {
while (true) {
synchronized (locker) {
synchronized (locker2) {
try {
locker.wait();
Thread.sleep(10_0000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
});
t5.start();
Thread.sleep(1000);
//System.out.println(t5.getState());
Thread t6 = new Thread(() -> {
synchronized (locker) {
//抢到锁的t4 进入休眠, 不释放锁
synchronized (locker2) {
while (true) {
}
}
}
});
t6.start();
Thread.sleep(1000);
System.out.println(t6.getState());
}
以上就是线程的六大状态, 如果感觉由帮助的话麻烦点赞收藏以下谢谢 🌹🌹🌹