Java 线程生命周期

由 chalex 创建,小路依依 最后一次修改 2017-01-09

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


线程总是处于以下六种状态之一:

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

线程的所有这些状态都是JVM状态。

当一个线程被创建并且它的start()方法还没有被调用时,它处于新的状态。

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

准备运行或运行的线程处于可运行状态。

如果线程尝试输入或重新输入同步的方法或块,但该监视器正在被另一个线程使用,则该线程处于阻塞状态。


状态转换

线程可以通过调用下表中列出的方法将自身置于等待状态。

方法描述
wait()从Object类。
join()从Thread类。
park()从java.util.concurrent.locks.LockSupport类。调用此方法的线程可以通过调用线程上的unpark()方法等待直到许可可用。

线程可以通过调用下表中列出的方法将自身置于等待等待状态。

描述描述
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包中。

已完成其执行的线程处于终止状态。

终止的线程不能转换到任何其他状态。


例子

我们可以使用一个线程的isAlive()方法,在它已经启动后,知道它是否存活或终止。

我们可以使用Thread类中的getState()方法来随时获取线程的状态。

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

以下代码演示了线程从一个状态到另一个状态的转换。

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());
  }
}

上面的代码生成以下结果。

W3Cschool app 编程微课功能上线
二维码
建议反馈
二维码