Java多线程---线程状态和基本方法

线程的生命周期

线程从创建到死亡经历五种状态:
新建状态:当一个线程被创建完成之后就进入到新建状态
就绪状态:当一个线程调用start()方法的时候进入到就绪状态
运行状态:当一个线程被CPU调度之后就进入到运行状态
阻塞状态:当一个线程调用sleep()、wait()等方法时就进入到阻塞状态
线程死亡:当线程被中断或者停止,就进入死亡状态,线程不能启动两次
但是有时候我们好像还见过另外一种表述的线程状态:
NEW:一个对象被实例化之后就进入到初始状态
RUNNABLE:当线程对象调用start()方法的时候就进入到RUNNABLE状态
WAITING:当线程对象调用wait(),join(),notify(),notifyAll()等方法时就进入到该状态
TIMED_WAITING:当线程对象调用sleep(long),wait(long),join(long)就会进入到该状态
BLOCKED:最明显的例子就是通过synchronized同步方法和同步代码块获取锁之后其他线程想要获取该锁要进入阻塞状态
TEMINATED:当线程执行完成之后会进入到终止状态
其实上述的这两种状态都需要记住,第一种是从操作系统层面划分的线程生命周期,而第二种是Java层面,Thread类下一个枚举类State下的6种状态

线程的基本方法

线程等待:wait方法

调用wait方法会进入到WAITING状态,只有等到其他线程的通知或者被中断后才会返回,它与notify和notifyAll方法对应,一定要记住的是当调用了wait方法后,该线程会进入到等待池中等待被唤醒,处于等待池中的线程不参与锁的竞争,调用wait方法会释放对象的锁

线程睡眠:sleep方法

sleep()方法用白话讲就是使正在运行中的线程睡一会,醒来之后继续运行,它不是释放对象的锁

线程让步:yield方法

做出让步,使当前获取到时间片的线程让出CPU的使用权,与其他线程一起重新竞争CPU时间片

线程中断:interrupt方法

通知线程该被中断了,它会向线程发出一个终止通知信号,会影响该线程内部一个中断标识位。

线程加入:join方法

join方法用于等待其他线程终止,当前线程如果调用了一个线程的join方法,那么,当前线程会进入到阻塞状态,等到另外一个线程执行完毕后再从阻塞状态转为就绪状态等待获取CPU的时间片

线程唤醒:notify方法

用于唤醒等待池中的线程,随机唤醒一个,而notifyAll是唤醒所有

后台守护线程:setDaemon方法

线程分为用户线程和守护线程,守护线程为用户线程提供公共服务,在没有用户线程可服务时会自动离开

最后附一张图,能更好的的理解线程状态之间的转换

img

猜你喜欢

转载自blog.csdn.net/MarkusZhang/article/details/106174877
今日推荐