因为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状态,代表着线程进入了结束时刻,即将死亡。

状态转换图

java 周期任务生成 java 线程周期_java

线程重点方法介绍

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运行完毕后,会唤醒当前线程。