二、并发编程之线程状态

1、线程状态

二、并发编程之线程状态

  • Start:初始化状态,调用start()方法,线程状态就变成就绪状态。
  • ready-to-run:准备运行(就绪)状态,一旦抢占到了CPU就变成了运行状态,遇到stop(),或者run() exits
    就变成死亡状态。
  • Running:运行状态,线程运行结束后就变成了死亡状态,遇到Object.wait()就变成等待状态,遇到Thread.sleep()就变成睡眠状态,遇到IO阻塞或者进入同步代码块就变成阻塞状态。
  • Waiting:等待状态,必须通过Object.notify()或者Object.notifyAll()来进行唤醒,才会再次回到就绪状态,否则将会一直处于等待状态。
  • Sleeping:睡眠状态,超时等待,当一段时间过去之后,线程就能再次回到就绪状态。
  • Blocked:阻塞状态,当数据获取到了,或者获得同步锁了,就能变成运行状态,如果其他线程都关闭了IO scoket ,就变成死亡状态。
  • Dead:死亡状态。

2、代码演示

/**
 * 线程状态
 * */
public class ThreadStatus implements Runnable{
//	@Override
//	public void run() {
//		//sleep状态
//		while(true) {
//			System.out.println("自定义的线程执行了。。。");
//			try {
//				Thread.sleep(100);//线程处于sleep状态,当100毫秒过去之后,就会自动进入就绪状态
//			} catch (InterruptedException e) {
//				e.printStackTrace();
//			}
//		}
//	}
 
	@Override
	public synchronized void  run() {
		//wait状态
		while(true) {
			try {
				wait();//线程处于wait状态
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("自定义的线程执行了。。。");
		}
	}
	
	public static void main(String[] args) {
		// 初始化状态
		ThreadStatus n = new ThreadStatus();
		Thread thread = new Thread(n);//创建线程并指定线程任务
		thread.start();//启动线程
		while(true) {
			synchronized(n) {
				System.out.println("主线程执行了。。。");
				try {
					Thread.sleep(100);//线程处于sleep状态,当100毫秒过去之后,就会自动进入就绪状态
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				n.notifyAll();//唤醒所有等待状态的线程
			}
			
		}
	}
}