Java中线程的生命周期(线程状态)

时间:2020-01-09 10:35:05  来源:igfitidea点击:

为了更好地理解Java多线程编程,我们应该对Java中的线程生命周期和Java中的各种线程状态有一个很好的了解。

在Java中创建线程后,线程可以处于以下状态之一:

  • NEW
  • RUNNABLE
  • BLOCKED
  • WAITING
  • TIMED_WAITING
  • TERMINATED

Java中的线程状态说明

Java多线程中的各种线程状态如下。

1新状态-Java中的线程在创建但尚未启动时处于新状态,即未在线程对象上调用start()方法。

2Runnable状态–在线程对象上调用start()方法时,线程转换为可运行状态。处于可运行状态的线程计划由JVM运行,但是直到获得CPU周期后,它才可能开始运行。

开始运行后的Java线程可能会更改为以下一种状态:等待,阻止,恢复运行以及终止。

3阻塞状态–正在运行的线程可以在等待监视器锁定时将其状态更改为阻塞状态并暂时变为非活动状态。例如,如果一个线程已进入同步块,则其他试图获取锁以进入同一同步块的线程将被阻止。

synchronized (object reference) {   
  //critical section
}

具有锁的线程释放它之后,调度程序将随机选择该同步块上的一个线程阻塞并更改其状态,以便它可以继续运行。处于阻塞状态的线程不会获得任何CPU时间。

4等待状态–正在运行的线程可以通过调用Object.wait()或者Thread.join()方法而没有任何超时参数来进入不确定的等待状态。
处于等待状态的线程正在等待另一个线程执行特定操作。例如,一个在对象上调用Object.wait()的线程正在等待另一个线程在该对象上调用Object.notify()或者Object.notifyAll()。名为Thread.join()的线程正在等待指定的线程终止。

5Timed_Waiting状态–当线程使用超时参数调用以下方法之一时,该线程处于定时等待状态。

  • Thread.sleep

  • Object.wait with timeout

  • Thread.join with timeout

  • LockSupport.parkNanos

  • LockSupport.parkUntil

例如

MyThread thread = new MyThread();
thread.start();
try {
  thread.sleep(500);
} catch (InterruptedException e){

}

此代码将导致当前正在执行的线程进入休眠状态(暂时停止执行)500毫秒。

6终止状态–完成执行的线程进入终止状态。

在Java代码中获取线程状态

我们可以通过在返回Thread.State枚举的线程实例上调用getState()方法来获取Java中的线程状态。

class AnotherThread implements Runnable{
  @Override
  public void run() {
    System.out.println("run method of Another thread --" 
      + Thread.currentThread().getName());	
  }	
}

public class ThreadDemo {
  public static void main(String[] args) {
    Thread thread = new Thread(new AnotherThread(), "AnotherThread");
    Thread.State ts = thread.getState();
    System.out.println("Thread state-- " + ts.name());
    thread.start();
    System.out.println("Thread state after start-- " + thread.getState().name());
  }
}

输出:

Thread state-- NEW
Thread state after start-- RUNNABLE
run method of Another thread --AnotherThread