多线程得状态
NEW
创建一个线程对象,此时得线程还没有真正得存在,只是创建了一个一般得对象,在这个对象调用了start()之后将进入了就绪得状态RUNNABLE.
RUNNABLE
创建得线程对象只有调用start()之后才正式得创建了一个线程,这个状态就是就绪状态,此状态得线程可以获得CPU的调度(也就是线程获得了执行的资格),RUNNABLE状态得线程只能意外得终止或者进入RUNNING状态,不会进入BLOCK或者TERMINATED状态,因为这些状态的需要调用wait和sleep,或者其他的block的IO操作,需要获得CPU的执行权才可以。
RUNNING
一旦CPU通过轮询的或者其他的方式从任务可执行的队列中选中了线程,那么此时它才是真正的执行自己的逻辑代码,RUNNING状态的其实也是RUNNABLED状态,但是反过来不成立。RUNNING状态可以在一下状态切换。
1.TERMINATED: 使用stop(),但是JDK不推荐使用。
2.BLOCKED状态,比如sleep,或者wait()进入waitSet中,或者进行阻塞IO操作(比如网路数据的读写),或者获取某个锁资源,从而进入了该锁的阻塞队列中进入了BLOCKED状态.
3.RUNNABLE:CPU的调度器的轮询,使得哎线程放弃执行,进入RUNNABLE状态,或者该线程主动的调用了yield方法,放弃CPU的执行权.
BLOCKED
由上可知进入BLOCKED状态的原因。线程进入BLOCKED状态可以在以下几种状态切换。
1.TERMINATED:调用stop()不推荐或者JVM Crash.
2.RUNNABLE:线程阻塞的操作结束,进入了RUNNABLE状态;线程完成指定的休眠,进入RUNNABLE;Wait中的线程渠道了某个锁资源,进入RUNNABLE;现在在阻塞的过程被打断,调用了interrupt()。
TERMINATED
TERMINATED是一个线程的最终状态,线程进入TERMINATED状态,意味着该线程的整个生命周期都结束了,下列的情况将会是线程进入TERMIATED状态.
1.线程运行正常结束,结束生命周期
2.线程运行出错的意外结束。
3.JVM Crash,导致所有的线程都结束。
线程的start()源码解析。
start()的源代码如下:
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
/* Notify the group that this thread is about to be started
* so that it can be added to the group's list of threads
* and the group's unstarted count can be decremented. */
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
/* do nothing. If start0 threw a Throwable then
it will be passed up the call stack */
}
}
}