NEW(新建)
RUNNABLE(可运行)
BLOCKED(阻塞)
WAITING(等待)
TIMED_WAITING(计时等待)
TERMINATED:(终止)
获取线程的状态使用getState()方法。
几种状态之间的转换如下:
当我们执行new来创造出一个线程实例的时候,此时线程就处于新建状态。新建状态就是程序已经安排好了工作,但是还没有开始执行任务,等待下一步操作。
当我们创建好了线程实例,并且调用了start方法,程序就处于可运行状态,值得注意的是,在Java里面没有单独的把正在运行状态列为一个状态,而是把就绪状态和正在运行的状态统称为可运行状态Runnable。也就是说可运行状态中的线程分为两种就绪状态(ready)和正在运行状态(running)。
一般在执行多线程的任务时,一个线程不是从头执行到结束的,而是不断切换执行的,让其他线程有机会执行,线程调度的细节取决于系统的调度,一般当正在执行的线程被切换下的时候,就绪状态的线程就会以抢占式执行的方式开启另一个线程执行,也就是新换上的线程是哪一个是随机的。
我们也可以通过yield方法去结束一个线程的运行,该方法是一个静态方法。
这三个状态类似
阻塞状态:当一个线程试图获取一个对象锁,而这个锁已被占用(也就是发生锁竞争),该线程就会进入阻塞状态,直到其他的线程释放了锁,该线程就会进入可运行状态。
等待状态:当线程等待另外一个线程通知调度器出现一个条件时,该线程就会进入阻塞状态。例如,调用join方法或者wait方法。此时的线程位于阻塞队列之中
计时等待:调用sleep()计时方法,join()计时方法以及wait的一个重载版本可以传入时间作为参数,调用这些方法,线程就会进入计时等待状态,当时间到达时,线程会自动退出阻塞队列,变为就绪状态,也就是可运行状态。
区别:Blocked状态表示是在等待获取锁,waiting和timed_waiting表示等待其他线程发来唤醒通知
timed_waiting是不会一直等下去,到达设定时间就自动退出该状态,waiting是无限期等待唤醒。
终止状态就是线程分配的任务已经全部完成,到达该状态有两种方法:
1、线程运行完毕run方法自然退出。
2、因为一个没有捕获的异常,使得线程意外终止。