线程的6个状态
线程的状态由定义在Thread类内部的一个枚举Thread.State来表述,总共有6种状态,分别是NEW(新生)、RUNNABLE(可运行)、BLOCKED(阻塞)、WAITING(等待)、TIMED_WAITING(限时等待)、TERMINATED(停止)。
NEW
此时线程被创建,但还不可运行。
RUNNABLE
线程对象被调用了start()方法,此时线程调度器已通知操作系统将其安排到执行队列,等待CPU时间。
BLOCKED
执行过程中由阻塞I/O、竞争锁(等待获取锁)或者在条件变量上等待,使得线程处于此状态;这种状态的线程通常会被操作系统挂起(非可运行和非新生状态线程都有可能被挂起,被挂起的线程不拥有CPU时间)。
WAITING
可以调用wait()方法主动挂起线程后处于此状态,直到其他线程调用该对象的notify()或者notifyAll()方法后,才有可能退出此状态。
TIMED_WAITING
可以调用带标量时间参数的wait(long milliseconds)方法使当前线程处于此状态,其他与WAITING状态相同。
TERMINATED
当线程自然执行完成或者抛出异常后,将进入此状态,此时线程将永久不可执行。
线程相关基本方法
wait
使当前线程等待,使其进入对象的等待队列,当有时间参数时将会等待指定时间,调用对象此方法前当前线程当拥有对象锁,调用后将会释放对象锁。此后操作系统将会挂起当前线程,如果可执行线程数大于CPU数,当前线程可能会被交换出去。此方法可被中断。
notify/notifyAll
使相关联的WAITING和TIMED_WAITING状态下的线程回复可执行状态(即进入RUNNABLE状态),调用此方法前也必须拥有对象锁。
sleep
此方法是静态的,它使得当前线程进入TIMED_WAITING状态。此方法会抛出InterruptedException,如果当前线程在调用此方法前拥有某对象锁,它将不会释放锁,仅仅是让出CPU时间,让其他线程能获得CPU执行机会。
join
当A线程调用了B线程的join()方法后,A将进入等待状态,直到超时(针对带有参数的join方法)或者B线程执行完毕。其内部是使用wait()方法实现的。
yield
暗示线程调度器当前线程有意交出CPU使用权,让线程调度器执行其他线程,但是调度器可以忽略此请求。
interrupt
请求线程停止运行,当jdk中可抛出InterruptedException的方法正在执行时,调用此方法会使线程抛出此异常。当异常抛出后,线程会置其终端状态为真。如若捕获InterruptedException异常并不做处理的话,将不会有其他效果。
interrupted
此方法返回线程的中断状态,并置清除其中断标志,此后isInterrupted()返回false。
isInterrupted
此方法返回线程的中断状态。
isAlive
判断线程是否不处于NEW和TERMINATED状态。