📜  Java线程的运行状态和可运行状态的区别(1)

📅  最后修改于: 2023-12-03 14:43:04.645000             🧑  作者: Mango

Java线程的运行状态和可运行状态的区别

Java线程在运行过程中会经历不同的状态,在不同的状态下线程的行为和能力也不同。其中,运行状态(Running)和可运行状态(Runnable)是两个比较容易混淆的状态。本文将会详细介绍Java线程的运行状态和可运行状态的区别。

运行状态(Running)

当一个线程被CPU分配了时间片并正在执行代码时,其状态被称为运行状态。在运行状态下,线程正在执行它的任务,它可能还在等待某些资源,并试图获取这些资源。如果线程成功获取了资源,则它将继续执行任务。如果线程的任务结束了,那么它会自然地进入终止状态(Terminated)。

在Java中,线程的运行状态可以通过调用Thread.getState()方法来获得,如果返回的状态为RUNNABLE,表示线程正在运行。

下面是一个简单的示例代码,展示了线程的运行状态:

public class MyThread extends Thread {
  public void run() {
    for (int i = 0; i < 10; i++) {
      System.out.println("线程正在运行:" + i);
    }
  }

  public static void main(String[] args) {
    MyThread thread = new MyThread();
    thread.start();

    Thread.State state = thread.getState();
    System.out.println("线程状态:" + state);

    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    state = thread.getState();
    System.out.println("线程状态:" + state);
  }
}

在上面的示例代码中,我们创建了一个MyThread类,继承了Thread类,并重写了run()方法,该方法会输出一些文本信息。在main()方法中,我们创建了一个MyThread实例,并通过调用start()方法来启动该线程。然后,我们通过调用getState()方法获取线程的状态,并输出到控制台中。我们还让主线程睡眠了一段时间,以便观察线程的状态发生变化。最后,我们再次调用getState()方法获取线程的状态,并将其输出到控制台中。

运行上述代码,我们会看到如下输出结果:

线程状态:RUNNABLE
线程状态:TERMINATED

从输出结果可以看出,当线程处于运行状态时,其状态为RUNNABLE。在线程的run()方法执行完毕后,线程进入了终止状态(TERMINATED)。

可运行状态(Runnable)

当一个线程被创建并启动后,其状态为可运行状态(Runnable)。在可运行状态下,线程已经被添加到线程池中,但还没有获得CPU资源执行任务。线程会一直保持在可运行状态,直到它获得了CPU资源开始执行任务,或者被阻塞(Blocked)或挂起(Suspended)。

在Java中,线程的可运行状态可以通过调用Thread.getState()方法来获得,如果返回的状态为RUNNABLE,表示线程处于可运行状态。

下面是一个简单的示例代码,展示了线程的可运行状态:

public class MyThread extends Thread {
  public void run() {
    for (int i = 0; i < 10; i++) {
      System.out.println("线程正在运行:" + i);
    }
  }

  public static void main(String[] args) {
    MyThread thread = new MyThread();
    Thread.State state = thread.getState();
    System.out.println("线程状态:" + state);

    thread.start();

    state = thread.getState();
    System.out.println("线程状态:" + state);

    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    state = thread.getState();
    System.out.println("线程状态:" + state);
  }
}

在上面的示例代码中,我们创建了一个MyThread类,继承了Thread类,并重写了run()方法,该方法会输出一些文本信息。在main()方法中,我们创建了一个MyThread实例,并通过调用getState()方法获取线程的状态,并输出到控制台中。然后,我们调用了start()方法来启动该线程,并再次通过调用getState()方法获取线程的状态,并将其输出到控制台中。我们还让主线程睡眠了一段时间,以便观察线程的状态发生变化。最后,我们再次调用getState()方法获取线程的状态,并将其输出到控制台中。

运行上述代码,我们会看到如下输出结果:

线程状态:NEW
线程状态:RUNNABLE
线程状态:TERMINATED

从输出结果可以看出,当线程处于可运行状态时,其状态为RUNNABLE。在线程的run()方法执行完毕后,线程进入了终止状态(TERMINATED)。

总结

Java线程的运行状态和可运行状态的区别在于:当一个线程被CPU分配了时间片并正在执行代码时,其状态被称为运行状态;当一个线程被创建并启动后,其状态为可运行状态。在可运行状态下,线程已经被添加到线程池中,但还没有获得CPU资源执行任务。线程会一直保持在可运行状态,直到它获得了CPU资源开始执行任务,或者被阻塞(Blocked)或挂起(Suspended)。在Java中,线程的状态可以通过调用Thread.getState()方法来获得,如果返回的状态为RUNNABLE,表示线程处于可运行状态,如果返回的状态为RUNNING, 表示线程处于运行状态。