五种状态
这是从操作系统层面来描述的
初始状态: 仅仅是在语言层面创建了线程对象,还没有与操作系统线程相关联
可运行状态:指该线程已经被创建(与操作系统线程关联),可以由cpu调度执行
运行状态:指获取了cpu时间片运行中的状态
当cpu时间片 用完,会从运行状态转换至可运行状态,会导致线程的上下文切换
阻塞状态
- 如果调用了阻塞API,如BIO读写文件,这个时候线程实际不会用到cpu,会导致线程上下文切换,进入阻塞状态;
- 等BIO操作完毕,会由操作系统唤醒阻塞的线程,转换成可运行状态;
- 与可运行状态的区别是,对阻塞状态的线程来说只要它们一直不唤醒,调度器就一直不会考虑调度它们。终止状态:
终止状态:表示线程已经执行完毕,生命周期已经结束,不会再转换为其它状态
六种状态
这是从Java API层面来描述的
NEW:线程刚被创建,但是还没有调用start()方法
RUNNABLE:当调用了start()方法之后,注意,Java API层面的RUNNABLE状态涵盖了操作系统层面的可运行状态,运行状态和阻塞状态
TIMEINATED:线程代码运行结束
假设有线程Thread t
情况1 NEW-->RUNNABLE
- 当调用t.start()方法时,由NEW-->RUNNABLE
情况2 RUNNBALE <-->WAITING
线程用synchronized(obj)获取了对象锁之后
- 调用obj.wait()方法时,t线程从RUNNBALE -->WAITING
- 调用obj.notify()、obj.notifyAll()、t.interrupt()时
- 竞争成功,t线程从WAITING-->RUNNABLE
- 竞争失败,t线程从WAITING-->BLOCKED
情况3 RUNNABLE<-->WAITING
- 当前线程调用t.join()方法时,当前线程从RUNNABLE-->WAITING
注意是当前线程在t线程对象的监视器上等待
- t线程运行结束,或者调用了当前线程的interrupt()时,当前线程从WAITING-->RUNNABLE
情况4 RUNNABLE<-->WAITING
- 当前线程调用LockSupport.park()方法会让当前线程从RUNNABLE-->WAITING
- 调用LockSupport.unpark()或者调用了线程的interrupt(),会让目标线程从WAITING-->RUNNABLE
情况5 RUNNABLE<-->TIMED_WAITING
t线程使用synchronized(obj)获取了对象锁后
- 调用obj.wait(long n)方法时,t线程从RUNNABLE-->TIMED_WAITING
- t线程等待时间超过了n毫秒,或者调用obj.notify()、obj.notifyAll()、t.interrupt()时
- 竞争成功,t线程从TIMED_WAITING-->RUNNABLE
- 竞争失败,t线程从TIMED_WAITING-->BLOCKED
情况6 RUNNABLE<-->TIMED_WAITING
- 当前线程调用t.join(long n)方法时,当前线程从RUNNABLE-->TIMED_WAITING
- 当前线程等待时间超过了n毫秒,或者t线程运行结束,或者调用了当前线程的interrupt()时,当前线程从TIMED_WAITING-->RUNNABLE
情况7 RUNNABLE<-->TIMED_WAITING
- 当前线程调用Thread.sleep(long n),当前线程从RUNNABLE-->TIMED_WAITING
- 当前线程等待时间超过了n毫秒,当前线程从TIMED_WAITING-->RUNNABLE
情况8 RUNNABLE<-->TIMED_WAITING
- 当前线程调用LockSupport.parkNanos(long nanos)或者LockSupport.parkUntil(long millis)时,当前线程从RUNNABLE-->TIMED_WAITIG
- 调用LockSupport.unpark(目标线程)或者调用了线程的interrupt(),或者等待超时,会让目标线程从TIMED_WAITING-->RUNNABLE
情况9 RUNNABLE<-->BLOCKED
- t线程用synchronized(obj)获得了对象锁时如果竞争失败,从RUNNABLE-->BLOCKED
- 持obj锁线程的同步代码块执行完毕,会唤醒该对象上所有BLOCKED的线程重新竞争,如果t线程竞争成功,从BLOCKED-->RUNNABLE,其它失败的线程仍然BLOCKED
情况10 RUNNABLE-->TERMINATED
当前线程所有代码运行完毕,进入TERMINATED