线程如何从 运行 可运行状态转移?

How does a thread move from running to runnable state?

我想知道线程如何以及何时在可运行和 运行 之间来回移动 states.What 实际上发生在 scenes.I 猜测这将在 ThreadPool 的情况下需要但我无法理解 entirely.Please 帮助我理解这一点。

Yield是一个静态方法,它告诉当前正在执行的线程给线程池中具有同等优先级的线程一个机会。

不保证Yield会立即使当前执行的线程进入可运行状态。请记住重要的一点,即 yield 方法不会使线程进入 Wait 或 Blocked 状态。它只能使线程从运行状态变为可运行状态。

Java SCJP 认证程序员指南摘录:线程:

static void yield() 此方法使当前线程暂时暂停执行,从而允许其他线程执行。由 JVM 决定是否以及何时进行此转换。

static void sleep(长毫秒)抛出 InterruptedException 当前线程在有资格再次 运行ning 之前休眠指定的时间。

最终 void join() 抛出 InterruptedException final void join(long millisec) 抛出 InterruptedException 对线程上调用的这两种方法中的任何一种的调用都将等待,而不是 return,直到线程完成或在指定时间后超时。

无效中断() 该方法中断调用它的线程。在 Waiting-for-notification、睡眠或 Blocked-for-join-completion 状态下,线程将收到 InterruptedException。

下面的示例说明了线程状态之间的转换。 (1) 处的线程在 (2) 处稍微休眠,然后在 (3) 处循环执行一些计算,之后线程终止。 main() 方法在 (4) 的循环中监视线程,打印由 getState() 方法编辑的线程状态 return。输出显示线程在 运行() 方法开始执行时进入 RUNNABLE 状态,然后转换到 TIMED_WAITING 状态休眠。醒来时,它在 RUNNABLE 状态下计算循环,并在 运行() 方法完成时转换到 TERMINATED 状态。

示例:线程状态

public class ThreadStates {

  private static Thread t1 = new Thread("T1") {    // (1)
    public void run() {
      try {
        sleep(2);                                  // (2)
        for(int i = 10000; i > 0; i--);            // (3)
      } catch (InterruptedException ie){
        ie.printStackTrace();
      }
    }
  };

  public static void main(String[] args) {
    t1.start();
    while(true) {                                  // (4)
      Thread.State state = t1.getState();
      System.out.println(state);
      if (state == Thread.State.TERMINATED) break;
    }
  }
}

程序可能的输出:

RUNNABLE
TIMED_WAITING
...
TIMED_WAITING
RUNNABLE
...
RUNNABLE
TERMINATED

if thread is in running state that means its executing run() method and when its in runnable method its executing start() method....so I guess moving from running to runnable means its going back from run() to start()

在大多数操作系统的命名法中,"running"表示线程实际上正在执行某些CPU上的指令,而"runnable"表示没有任何东西阻止线程"running" 除了可用性 CPU 到 运行 上。

Java 程序无法区分这两种状态。 Java 知道的线程状态是 NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING 和 TERMINATED。

一个线程在 t.start() 被调用之前是 NEW 的,之后它永远不能回到 NEW 状态。 WAITING 和 TIMED_WAITING 都表示该线程正在等待某个其他线程中的 notify() 调用。 BLOCKED 表示它正在等待其他任何事情(例如,进入 synchronized 块),而 TERMINATED 表示它已完成。