多线程得状态

Java并发编程基础(一)-LMLPHP

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 */
			}
		}
	}
01-10 10:59