public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
初始态:NEW
可运行状态:RUNNABLE
- 该状态下的线程已经获得执行所需的所有资源,只要CPU分配执行权就能运行。
阻塞态:BLOCKED
- 当一条正在执行的线程请求某一资源失败时,就会进入阻塞态。
- 请求锁失败时进入的状态。
- 由一个阻塞队列存放所有阻塞态的线程。
- 处于阻塞态的线程会不断请求资源,一旦请求成功,就会进入就绪队列,等待执行。
等待态:WAITING
- 当前线程中调用wait、join、park,当前线程就会进入等待态。
- 也有一个等待队列存放所有等待态的线程。
- 线程处于等待态表示它需要等待其他线程的指示才能继续运行。
- 进入等待态的线程会释放CPU执行权,并释放资源(如:锁)
计时等待态:TIMED_WAITING
- 当调用sleep、wait、join、LockSupport.parkNanos或者LockSupport.partUntil,进入该状态
- 它和等待态一样,并不是因为请求不到资源,而是主动进入,并且进入后需要其他线程唤醒
- 进入该状态后释放CPU执行权 和 占有的资源
- 与等待态的区别:到了超时时间后自动进入阻塞队列,开始竞争锁
终止态:TERMINATED
几个区别
Sleep和wait的区别
- sleep()该方法是属于 Thread 类中的,而 wait()方法则是属于 Object 类中的。
- sleep()方法导致了程序暂停执行指定的时间,让出 cpu 给其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态,但是不会释放对象锁.
- wait()方法线程会放弃对象锁,进入等待此对象的等待队列,只有针对此对象调用 notify()方法后,等待的线程才进入对象锁定池准备获取对象锁进入运行状态。
start与run区别
- start()方法来启动线程,真正实现了多线程运行。这时无需等待 run 方法体代码执行完毕, 可以直接继续执行下面的代码。
- 通过调用 Thread 类的 start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。
- 方法 run()称为线程体,它包含了要执行的这个线程的内容,线程就进入了运行状态,开始运行 run 函数当中的代码。 Run 方法运行结束, 此线程终止。然后 CPU 再调度其它线程。