Java 线程的6种状态

以下内容参考书籍《java并发编程系统于模型》

1、NWE 至今尚未启动的线程状态。

2、RUNNABLE

可运行线程的线程状态。处于可运行状态的某一线程正在java虚拟几中运行,但它可能等待操作系统中的其他资源,比如cpu。

3、BLOCKED

受阻塞并且正在等待监视器锁的某一线程的线程状态。处于阻塞状态的某一线程正在等待监视器锁,以便进入一个同步的块/方法,或是调用Object.wait()方法之后再次进入同步块的方法(从这里也可以看出wait和sleep方法的一点不同,调用wait()方法,不仅会让出cpu也会释放监视器锁,而sleep()方法只会暂时让出cpu,但并没有释放已或得的锁)。

4、WAITING

某一等待线程的等待状态。某一线程因为调用下列方法而处于等待状态:

不带超时值的Object.wait方法被调用

不带超时值的Thread.join方法被调用

不带超时值的LockSupport.park方法被调用

waiting状态的线程。处于等待状态的线程在等带另一个线程完成之后才执行特定的操作,通常是在等待cpu。比如,在某个对象上调用Object.wait()的线程,就在等待其他的线程在该对象上调用Object.notify()或Object.notifyAll()之后才会去重新竞争cpu和锁。又或是Thread.join()的线程正在等待制定线程的终止,主线程会等待子线程终止后再继续执行。

package com.zrh.thread;

/**
 * 主线会等待子线程执行完后才会执行
 * @author Administrator
 *
 */
public class JoinThread implements Runnable{

	public void run() {

		for (int i = 0; i < 1000; i++) 
			;
		System.out.println("run JoinThread!");
		
	}
	
	public static void main(String[] args) throws InterruptedException {
		System.out.println("run main1");
		Thread join  = new Thread(new JoinThread());
		join.start();
		join.join();
		System.out.println("run main2");
	}

}

执行结果:

run main1
run JoinThread!
run main2

5.TIME_WAITING

具有指定等待时间的某一等待线程的线程状态。某一线程因为调用以下带有指定等待时间的方法之一而处于等待状态:

Thread.sleep 方法被调用

带有超时值的Object.wait 被调用

带有超时值的Thread.join 被调用

LockSupport.parkNanos 被调用

LockSupport.parkUntil 被调用

6、TERMINATED

已终止的线程状态。线程已经执行结束


注意:在给定的时间点上,一个线程只能处于一种状态。这些状态是虚拟机状态,JVM这样划分,更多是从线程的所表现的行为来考虑的,并没有反应操作系统的线程状态,比如Tread.sleep方法在操作系统的线程状态就是阻塞态,而在java线层状态是TIME_WAITING态。线程之间的转换如下:







猜你喜欢

转载自blog.csdn.net/sinat_36265222/article/details/78249503