我想知道Thread如何以及何时在可运行状态和运行状态之间来回移动。幕后实际发生了什么。我想在ThreadPool的情况下需要这个但我无法完全理解。请帮助我理解这一点。
答案 0 :(得分:7)
如果线程处于运行状态,这意味着它正在执行run()方法,并且当它在runnable方法中执行start()方法....所以我想从运行到runnable意味着它从run()返回到启动()
在大多数操作系统的命名中,"运行"意味着线程实际上正在某些CPU上执行指令,并且" runnable"意味着没有什么能阻止线程运行"运行"除了可以运行的CPU的可用性。
Java程序无法区分这两种状态。该线程表明Java知道的是NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING和TERMINATED。
在调用t.start()
之前,线程是新的,之后它永远不会回到NEW。 WAITING和TIMED_WAITING都意味着线程正在等待某个其他线程中的notify()
调用。 BLOCKED表示它正在等待其他任何事情(例如,输入synchronized
块),TERMINATED表示它已完成。
答案 1 :(得分:1)
Yield
是一个静态方法,它告诉当前正在执行的线程为线程池中具有相同优先级的线程提供机会。
无法保证Yield
会立即使当前正在执行的线程处于可运行状态。请记住,yield方法不会使线程进入等待或阻塞状态这一点很重要。它只能使一个线程从Running State变为Runnable State。
答案 2 :(得分:0)
摘自程序员Java SCJP认证指南:主题:
静态空隙率() 此方法使当前线程暂时暂停其执行,从而允许其他线程执行。由JVM决定是否以及何时进行此转换。
static void sleep(long millisec)抛出InterruptedException 当前线程在有资格再次运行之前会在指定时间内休眠。
final void join()抛出InterruptedException final void join(long millisec)抛出InterruptedException 对线程上调用的这两个方法中的任何一个的调用将等待,直到线程完成或在指定时间后超时为止,才会返回。
void interrupt() 该方法中断调用它的线程。在等待通知,休眠或阻塞加入完成状态中,线程将收到InterruptedException。
下面的示例说明了线程状态之间的转换。 (1)处的线程在(2)处稍微休眠,然后在(3)的循环中进行一些计算,之后线程终止。 main()方法在(4)的循环中监视线程,打印getState()方法返回的线程状态。输出显示当run()方法开始执行时线程进入RUNNABLE状态,然后转换到TIMED_WAITING状态进入休眠状态。在唤醒时,它计算RUNNABLE状态的循环,并在run()方法完成时转换为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