1.生命周期的五种状态:
新建状态、就绪状态、运行状态、阻塞状态、死亡状态
1.1新建状态
当实例化Thread对象后,线程就处于新建状态,这时线程并没有执行。
public static void main(String[] args){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("子线程开始执行");
System.out.println("子线程执行结束");
}
});
}
2.2 就绪状态
只要在代码中启动了线程,就会从新建状态,变为就绪状态。
thread.start();
就绪状态属于一种临时状态。处于就绪状态的线程会去抢占CPU,只要抢占成功就会切换到运行状态,失去了cpu执行权,回到就绪状态。
2.3 运行状态
运行状态就是开始执行线程的功能。具体就是执行run()方法
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("子线程开始执行");
for (int i = 0; i < 10000; i++) {//运行状态 可停止
System.out.println(i);
}
System.out.println("子线程执行结束");
}
});
thread.start();
在代码执行过程中分为三种情况:
1. 如果碰到sleep() / wait() / join()等方法会让线程切换为阻塞状态。
2. 如果调用yield()方法或失去CPU执行权限会切换为就绪状态。
3. 如果run()方法成功执行完成,或出现问题或被停止(中断)会切换为死亡状态
2.4 阻塞状态
阻塞状态时,线程停止执行。让出CPU资源。
处于阻塞状态的线程需要根据情况进行判断是否转换为就绪状态:
1. 如果是因为sleep()变为阻塞,则休眠时间结束自动切换为就绪状态。
2. 如果是因为wait()变为阻塞状态,需要调用notify()或notifyAll()手动切换为就绪状态。
3. 如果因为join()变为阻塞状态,等到join线程执行完成,自动切换为就绪状态。
4. (已过时)如果是因为suspend()暂停的线程,需要通过resume()激活线程。
2.5 死亡状态
死亡状态即线程执行结束。