线程的五种状态
1) 新建状态
可以用下面的方法创建一个新的线程:
Thread MyThread = new Thread();
线程在已被创建而未被执行之前,处于新建状态。这时线程实例已被分配了内存空间,它的私有数据已被初始化,但该线程还未被调用。这时可以用start()方法启动它或用stop()方法终止它。新线程一旦被调用,就进入可运行状态。
2) 可运行状态
可以用start()方法来使新创建的线程进入可运行状态。
Thread MyThread = new Thread();
MyThread.start();
使用start()方法后,该线程就进入可运行状态。可运行状态就是线程的就绪状态,表示线程随时可以被调用,可运行状态并不等同于运行状态。由于很多计算机都是单处理器,所以要在同一时刻运行所有处于可运行状态的线程是不可能,Java的运行系统通过调度来使这些线程共享处理器。
3) 运行状态
运行状态表明线程正在运行,该线程拥有了处理器的控制权,将一直运行到完毕,除非运行过程中控制权被更高一级的线程强占。
在发生以下四种情况之一时,线程产生阻塞状态:
- 调用suspend()方法
- 调用sleep()方法
- 为等候一个条件变量,线程调用了wait()方法
- 输入/输出流中发生线程阻塞
4) 阻塞状态
在阻塞状态,一个线程要等它需要的事件发生后,才可以从阻塞行状态回到可运行状态。
在以下四种情况下可以使线程由阻塞状态恢复到可运行状态:
- 通过使用resume()方法使被suspend()挂起的线程恢复到可运行状态;
- 如果线程由于sleep()方法进入睡眠之中,那么当sleep()方法中参数指定的时间结束时,线程就恢复到可运行状态;
- 如果线程是等待条件变量,那么要停止等待的话,就需要该条件变量所在的对象调用notify()方法或notifyAll()方法;
- 如果在输入输出流中发生了线程堵塞,那么就要由特定的输入输出指令来结束当前的阻塞状态。
5) 死亡状态
死亡状态也就是线程的最终状态,处于死亡状态的线程不具有继续运行的能力。线程死亡的原因有以下两种:
- 正常运行线程完成了它的全部工作,即执行了run()方法的最后一个语句并退出。