因为IO和多核CPU的出现,为了提高CPU的利用率,引入了多线程。本文就说一下线程的生命周期!
线程有以下几种状态:
1、New
新创建的一个线程,还未调用start()
2、Runnable
以下两种状态
1、当线程准备就绪就等待CPU了 ready
2、当前线程正在运行 Running
这两种状态统称为Runnable
3、Blocked
当线程获取synchronized锁失败的时候,这种状态就是Blocked。这种时候是等待JVM来唤醒的。
4、Waiting
当线程调用t.wait()或者t.join()或者Lock.park()的时候,就会进入Waiting状态。
和Blocked状态不同的是,waiting状态是等待其他对象来唤醒的,而不是JVM。
5、Time Waiting
和Waiting不同的是,Time Waiting调用传入的有最大等待时间。当超过最大等待时间仍未被唤醒的话,线程会自动苏醒。
并且多了一个Thread.sleep(time)也会当前线程进入Time Waiting
6、Terminated
当线程运行完毕后,就会进入Terminated状态,代表着线程进入了结束时刻,即将死亡。
状态转换图
线程重点方法介绍
1、Thread.yield()
静态方法,当前线程放弃CPU运行时间,从Running进入Ready状态,让操作系统重新进行线程调度。
2、Thread.sleep()
静态方法,当前线程放弃CPU运行时间,从Running进入Time Waiting状态,但是不会放弃其拥有的锁。
3、interrupt()
非静态方法,当调用线程t.interrupt()方法后,本意就是当前线程想要中断线程t的运行,但是是否要结束运行,就有线程t自己处理。
当调用t.interrupt()后,线程t有2种方法来感应,
1、线程对应的t.isInterrupted()为true
2、如果线程t的运行代码被try catch包围的话,会被catch到。
interrupt()会将线程的中断标志设置为true
isinterrupted()会返回线程的中断标记,不会清除中断标记。
Thread.interrupted()返回当前线程的中断标记,会清除中断标记。
4、join()
非静态方法,当前线程如果调用了t.join(),当前线程即使代码运行完成也不会退出,会进入Waiting状态。当线程t运行完毕后,会唤醒当前线程。