线程状态转换图
1.新建:通过创建Thread类的一个实例对象(之后会一直称为此线程对象)并传入一个 Runnable接口的实现类象,创建并注册此线程(之后也会一直称为此线程)。
2.启动:通过调用此Thread对象的start方法,运行此Runnable对象(之后会一直称为此对象)的run方法,启动此线 程。
3.可运行状态:启动此线程后,此线程会参加排队,等待时间片调度。
4.运行状态:此线程获得时间片后,进入运行状态,在这期间可能会发生以下某种或多种情况:
4.1-本次时间片结束时此线程没有执行完毕,重新回到可运行状态;
4.2-通过此线程对象的yield方法,把时间片让给其他线程,重新回到可运行状态;
4.3-通过调用此线程对象的sleep方法,使该线程进入暂停(阻塞/等待)状态,在指定暂停时间内,如果有其他线程调用此线程对象的 interrunpt 方法,此线程会被中断唤醒,提前回到可运行状态。否则将在指定暂停时到达后再回到可运行状态;
4.4-通过调用此线程对象的 join 方法,此线程所处的当前线程会进入等待此线程执行完毕的暂停状态。当然在调用此线程对象的join方法时,可以指定当前线程的最长等待时间。在此期间当前线程一直处于暂停状态,如果没有其他线程通过调用此线程对象的interrupt方法中断唤醒此线程的话;
4.5-如果此线程参加了此对象的资源同步,且在要进入此对象的 synchronized 同步块内时,如果已有其他线程取得了此对象的监视器,那么,此线程对进入此对象的监视器等待集中。然后,此线程以常规方式与其他线程竞争,以获得在此对象上同步的权利(也就是获得此对象的监视器),一旦获得此对象的控制权(监视器),对此对象的同步声明都将恢复到以前的状态,此线程会回到可运行状态;
4.6-如果此线程参加了此对象的资源同步,在调用此对象的wait方法时,此线程进入此对象的等待集中,然后放弃对此对象上的所有控制权(交出此对象的监视器)。当然可以在调用此对象的wait 法时指定此线程等待的最长时间,在指定等待时间到达之前,或处于一直等待的状态的时候,如果其他某个拥有此对象监视器的线程调用此对象的 notify/notifyAll 方法,或被其他线程中断唤醒,此线程对进入此对象的监视器等待集中;
注意,此方法只应由作为此对象监视器的所有者的线程来调用。
注:join/wait:如果指定时间为0,则一直等待下去。
sleep:如果指定时间为0,则不予考虑。
5.终止状态:如果此线程执行完毕,最终进入终止状态,且不能够再次启动。