线程状态主要有六种
- 创建
- 就绪
- 阻塞
- 等待
- 计时等待
- 终止
我们将会在后面慢慢介绍。
获取当前的状态,你需要调用getState方法。
创建状态
当你使用new创建线程时,线程还没有运行,这就是创建状态,在他运行之前,你需要配置一些东西。
就绪状态
一旦你执行了start函数,线程就进入就绪状态,现在线程是可执行的。一个可执行的线程可能在执行,也可能没有执行。这决定于操作系统是否给线程时间执行。
当线程执行时,它不一定一直在执行,事实上,我们希望线程经常停止,给其他线程执行时间。线程执行的方式受操作系统的影响。当给定的时间运行完毕后,操作系统会运行其他线程。当判定当前应该执行哪个线程时,需要考虑线程的优先级。
现在所有桌面操作系统和服务器操作系统都使用抢占模式,但是一些智能设备使用合作调度。在这些情况下,线程还有在调用yield方法或者被阻塞和等待时被阻塞。
在多核处理器上,每个处理器可以运行一个线程,多个线程可以同步运行,当然,如果线程数多于核心数,那么还是会按照时间片分配。
阻塞和等待线程
当线程被阻塞和等待时,他们处于非活动状态,他们不运行任何代码,只占用最少的资源。需要经过线程调度唤醒他们。怎么唤醒依赖于非活动状态的到达方式。
- 当线程尝试获取内部对象锁时(表示java.util.concurrent包中的Lock),而这个锁被其他线程占有时,这个线程被阻塞(blocked),当其他所有线程都没有占有这个锁,而且线程调度器允许这个线程执行时,这个线程退出阻塞状态。
- 当线程等待其他线程提醒线程调度器安排其他线程时,它进入等待状态。我们在之后详细讨论。
- 一些方法设有超时参数。调用他们会让这个线程进入计时等待状态。当超时或者接收到适当的提醒时,退出该状态。下图给出了状态转换过程,
结束的线程
线程结束的原因主要包括:
- run方法运行结束,自然死亡。
- 因为未处理的异常而结束。
此外,你还可以使用stop方法结束线程。但是这个方法已经被废弃,你不应该使用它。