一、线程的状态
Thread源码中有个枚举State,总共定义了线程的六种状态:
public enum State { NEW, //新建状态,线程对象已经创建,但尚未启动 RUNNABLE, //就绪状态,可运行状态,调用了线程的start方法,已经在java虚拟机中执行,等待获取操作系统资源如CPU,操作系统调度运行。 BLOCKED, //堵塞状态。线程等待锁的状态,等待获取锁进入同步块/方法或调用wait后重新进入需要竞争锁 WAITING, //等待状态。等待另一个线程以执行特定的操作。调用以下方法进入等待状态。 Object.wait(), Thread.join(),LockSupport.park TIMED_WAITING, //线程等待一段时间。调用带参数的Thread.sleep, objct.wait,Thread.join,LockSupport.parkNanos,LockSupport.parkUntil TERMINATED; //结束状态。 }
堵塞状态(Blocked):
实例:小亮要骑车去上班,结果发现自行车被锁住了,现在小亮无法去上班了,就是处于堵塞状态了。
进入堵塞状态的方法:
- 当一个线程要进入synchronized语句块/方法时,如果没有获取到锁,会变成BLOCKED
- 在调用Object.wait()后,被notify()唤醒,再次进入synchronized语句块/方法时,如果没有获取到锁,会变成BLOCKED
不限期等待状态(waiting):
实例:小亮喜欢小红,知道她也去上班,就在楼下等着她一起去上班(小红不下来,他就不走)
进入不限期等待状态的方法:
- 没有设置timeout参数的Object.wait()
- 没有设置timeout参数的Thread.join()
- LockSupport.park()
限期等待状态(timed_waiting):
实例:小亮知道小红也去上班,就打算等她半小时,结果她还没有下来,于是小亮决定不等她了,直接去公司了。
进入限期等待的方法:
- Thread.sleep()方法
- 设置了timeout参数的Object.wait()方法
- 设置了timeout参数的Thread.join()方法
- LockSupport.parkNanos()方法
- LockSupport.parkUntil()方法
二、线程常用方法
线程整个生命周期有五种状态:新建、就绪、运行、堵塞、死亡。
线程的常用方法及状态的变化:
1、新建状态=》就绪状态:线程调用start()方法之后进入就绪状态
2、就绪状态=》运行状态:操作系统给线程分配的时间片之后进入运行状态
3、运行状态=》就绪状态:线程执行完时间片后进入就绪状态
4、运行状态=》堵塞状态:调用阻塞方法进入阻塞状态
5、阻塞状态=》就绪状态:解除阻塞之后进入就绪状态
6、运行状态=》死亡状态:run方法结束或者中断请求,线程进入死亡状态
线程常用方法:
- start() : 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
- run() : 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回
- stop() : 中断线程,过期不推荐使用
- sleep() : 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
- wait() : 无参数是永久等待,有参数是在指定的毫秒数内让当前正在执行的线程等待被唤醒
- notify()/notifyAll() : 唤醒等待中的线程
- join() :等待执行了join的线程先完成
- interrupt() : 中断线程
- yield() : 让出当前线程的CPU时间
yield()方法,是让当前线程让出CPU时间进入就绪状态,但是下个时间片,该线程依然有可能被再次选中运行。