Java线程的状态

1. 线程的状态

  操作系统的PCB本身是有线程状态的, Java中的线程是⽤Thread表示的,本身是⼀个对象,所以⼜在这个基础上做了⼀套⾃⼰的体系。

1. NEW   Thread对象创建好了,但是还没用调用start方法在系统中创建线程。
2. TERMINATED   Thread对象仍然存在,但系统内部的线程已经执行完毕了。
3. RUNNABLE    就绪状态,表示这个线程正在CPU上执行,或者准备就绪随时可以去CPU上执行。
4. TIMED_WAITING     指定时间的阻塞,就在到达一定时间之后自动解除阻塞,使用sleep会进入这个状态,使用带有超过时间的join也会。
5. WAITING     不带时间的阻塞(死等),必须满足一定的条件,才会解除阻塞(join或者wait都会进入)。
6. BLOCKED     由于锁竞争,引起阻塞。

  其实,学习线程状态最大的作用还是:调用多线程代码的时候有bug的时候,可以给我们有一个重要的参考意见。

 2. 各种转态的含义和转换

2.1 NEW 创建

  处于 NEW 状态的线程此时尚未启动。这里的尚未启动指的是还没调用 Thread 实的start() 方法

public static void main(String[] args) {
        Thread t = new Thread(() ->{});
        System.out.println(t.getState());
    }

  一个Thread的对象只能start一次,和线程状态切换密切相关的,只有处于NEW状态才能start。

2.2 TERMINATED 终止 

  终止状态,此时线程已经执行完毕。

2.3RUNNABLE 运行

  表示当前线程正在运行中,处于RUNNABLE状态的线程可能在Java虚拟机中运行,也有可能在等待CPU分配资源。

/**
 * Thread state for a runnable thread.  A thread in the runnable
 * state is executing in the Java virtual machine but it may
 * be waiting for other resources from the operating system
 * such as processor.
 */

  2.4 TIMED_WATING 超时等待

  超时等待状态。线程等待一个具体的时间,时间到后会被自动唤醒。调用如下方法会使线程进入超时等待状态:

1. Thread.sleep(long millis):使当前线程睡眠指定时间,sleep() 方法不会释放当前锁,但会让出 CPU,所以其他不需要争夺锁的线程可以获取 CPU 执行;
2. Object.wait(long timeout):线程休眠指定时间,等待期间可以通过 notify() / notifyAll() 唤醒;
Thread.join(long millis):等待当前线程最多执行 millis 毫秒,如果 millis 为 0,则会一直执行;
3. LockSupport.parkNanos(long nanos): 除非获得调用许可,否则禁用当前线程进行线程调度指定时间;
4. LockSupport.parkUntil(long deadline):同上,也是禁止线程进行调度指定时间;

2.5 WAITING 等待

等待状态。处于等待状态的线程变成 RUNNABLE 状态需要其他线程唤醒。调用如下 3 个方法会使线程进入等待状态:

1. Object.wait():使当前线程处于等待状态直到另一个线程唤醒它;
2. Thread.join():使当前线程等待另一个线程执行完毕之后再继续执行,底层调用的是 Object 实例的 wait() 方法;
3. LockSupport.park():除非获得调用许可,否则禁用当前线程进行线程调度。

2.6 BLOCKED

  阻塞状态,处于BLOCKED状态的线程正等待锁的释放以进入同步区。

2.7 转化

Java线程的状态_第1张图片

  上图是一个自己画的一个简单的状态转化图很简单也方便理解。

Java线程的状态_第2张图片 

  这图这是百度截的一张图可以很清晰看出转化关系。 

你可能感兴趣的:(javaee)