举报投诉联系我们 手机版 热门标签 VUE中文网
您的位置:VUE中文网 > java线程生命周期有几种状态 Java 线程生命周期

java线程生命周期有几种状态 Java 线程生命周期

2023-03-26 00:17 Java教程

java线程生命周期有几种状态 Java 线程生命周期

java线程生命周期有几种状态

Java线程的生命周期有五种状态:新建、就绪、运行、阻塞和死亡。

新建:当创建一个新的Thread实例时,该实例处于新建状态。在这个阶段,Thread实例已经创建好了,但是还没有被启动。

就绪:当调用Thread实例的start()方法时,该实例就会处于就绪状态。在这个阶段,Thread实例已经准备好被执行,但是还没有被CPU执行。

运行:当CPU开始执行Thread实例时,该实例就会处于运行状态。在这个阶段,Thread实例正在执行run()方法中的代码。

阻塞:当一个Thread实例因为某些原因而放弃CPU时间片时(如I/O请求、向其他对象发送信号或者其他原因), 该实例就会处于阻塞状态。在这个阶段, Thread实例正在等待其他条件的改变而重新回到就绪或者运行的状态。

public void run(){  // 运行中 

    while(true){ 

        // do something 

        try{ 

            Thread.sleep(1000); // 阻塞1s 

        }catch(InterruptedException e){ 

            e.printStackTrace(); 

        } 

    } 
} 

死亡: 当一个Thread实例执行它的run()方法中的代码并且run()方法正常退出时, 该Thread实例就会处于死亡的生命周期中。

Java 线程生命周期

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

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

阅读全文
以上是VUE中文网为你收集整理的java线程生命周期有几种状态 Java 线程生命周期全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
© 2024 VUE中文网 vue88.com 版权所有 联系我们