【Java多线程】操作系统与Java中线程的生命周期

1 操作系统中的线程状态

  • 创建:线程从创建到被cpu执行之前的这个阶段。
  • 就绪:指线程已具备各种执行条件,一旦获取cpu便可执行。
  • 运行:表示线程正获得cpu在运行。
  • 阻塞:指线程在执行中因某件事而受阻,处于暂停执行的状态,阻塞的线程不会去竞争cpu。
  • 终止:线程执行完毕,接下来会释放线程占用的资源。

线程的生命周期图如下(进程与线程生命周期一样):

2 Java中线程的状态

Thread类中维护类一个内部枚举类State,里面是线程的状态,属性如下:

  • NEW:表示未启动的线程。
  • RUNNABLE:表示线程正在JVM中执行,但执行的动作也可能是“等待”:等待操作系统的某些资源如处理器。
  • BLOCKED:表示线程正在等待一个锁去进入某个同步方法或同步代码块。
  • WAITING:表示因为调用接下来的方法,线程正在等待。包括:Object.wait()、Thread.join()和LockSupport.part()。直到另外一个线程执行一个特殊的动作该线程才会退出等待状态。如:该线程调用Object.wait(),需要另外一个线程调用Object.notify()或Object.notifyAll()。
  • TIMED_WAITING:表示线程因为调用接下来的方法,线程正在等待,等待时间最多为一个具体的值。包括:Thread.sleep(time)、Object.wait(time)、Thread.join(time)、LockSupport.parkNanos(time)和LockSupport.parkUntil(time)。直到另外一个线程执行一个特殊的动作该线程才会退出等待状态。如:该线程调用Object.wait(3000),另外一个线程调用Object.notify()或Object.notifyAll()可以使该线程退出等待状态。
  • TERMINATED:表示一个终止的线程,这个线程的执行已经完成。

生命周期图如下,下面红色字体是操作系统中对应Java中的线程状态:

注意Java中,当线程执行到同步代码区,若线程被执行等待方法,则线程会释放锁并进入等待状态,等待状态的线程不会参与锁的竞争,即若其它持有锁的线程执行完成后不会唤醒处于等待状态的线程,而阻塞状态的线程可能会被唤醒。等待状态的线程被唤醒后会从等待队列移除,加入到阻塞队列中,参与锁的竞争。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章