Java 線程生命周期

2018-02-28 15:31 更新

Java線程教程 - Java線程生命周期


線程總是處于以下六種狀態(tài)之一:

  • New
  • Runnable
  • Blocked
  • Waiting
  • Timed-waiting
  • Terminated

線程的所有這些狀態(tài)都是JVM狀態(tài)。

當一個線程被創(chuàng)建并且它的start()方法還沒有被調用時,它處于新的狀態(tài)。

Thread  t = new MyThreadClass(); // t is in the   new state

準備運行或運行的線程處于可運行狀態(tài)。

如果線程嘗試輸入或重新輸入同步的方法或塊,但該監(jiān)視器正在被另一個線程使用,則該線程處于阻塞狀態(tài)。


狀態(tài)轉換

線程可以通過調用下表中列出的方法將自身置于等待狀態(tài)。

方法描述
wait()從Object類。
join()從Thread類。
park()從java.util.concurrent.locks.LockSupport類。調用此方法的線程可以通過調用線程上的unpark()方法等待直到許可可用。

線程可以通過調用下表中列出的方法將自身置于等待等待狀態(tài)。

描述描述
sleep()從Thread類。
wait (long millis)
wait(long millis, int nanos)
從Object類。
join(long millis)
join(long millis, int nanos)
從Thread類。
parkNanos (long nanos)
parkNanos (Object blocker, long nanos)
從LockSupport類,它在java.util.concurrent.locks包中。
parkUntil (long deadline)
parkUntil (Object blocker, long nanos)
從LockSupport類,它在java.util.concurrent.locks包中。

已完成其執(zhí)行的線程處于終止狀態(tài)。

終止的線程不能轉換到任何其他狀態(tài)。


例子

我們可以使用一個線程的isAlive()方法,在它已經(jīng)啟動后,知道它是否存活或終止。

我們可以使用Thread類中的getState()方法來隨時獲取線程的狀態(tài)。

此方法返回Thread.State枚舉類型的常量之一。

以下代碼演示了線程從一個狀態(tài)到另一個狀態(tài)的轉換。

class ThreadState extends Thread {
  private boolean keepRunning = true;
  private boolean wait = false;
  private Object syncObject = null;

  public ThreadState(Object syncObject) {
    this.syncObject = syncObject;
  }
  public void run() {
    while (keepRunning) {
      synchronized (syncObject) {
        if (wait) {
          try {
            syncObject.wait();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    }
  }

  public void setKeepRunning(boolean keepRunning) {
    this.keepRunning = keepRunning;
  }

  public void setWait(boolean wait) {
    this.wait = wait;
  }
}

public class Main {
  public static void main(String[] args) throws InterruptedException {
    Object syncObject = new Object();
    ThreadState ts = new ThreadState(syncObject);
    System.out.println("Before start()-ts.isAlive():" + ts.isAlive());
    System.out.println("#1:" + ts.getState());

    ts.start();
    System.out.println("After start()-ts.isAlive():" + ts.isAlive());
    System.out.println("#2:" + ts.getState());
    ts.setWait(true);

    Thread.currentThread().sleep(100);

    synchronized (syncObject) {
      System.out.println("#3:" + ts.getState());
      ts.setWait(false);
      syncObject.notifyAll();
    }

    Thread.currentThread().sleep(2000);
    System.out.println("#4:" + ts.getState());
    ts.setKeepRunning(false);

    Thread.currentThread().sleep(2000);
    System.out.println("#5:" + ts.getState());
    System.out.println("At the   end. ts.isAlive():" + ts.isAlive());
  }
}

上面的代碼生成以下結果。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號