在之前的文章中,已经介绍了关于线程的基础知识。
我的主页: ???爱吃南瓜的北瓜
文章目录
✍绪论?1.NEW?2.TERMINATED?3.RUNNABLE--------------------?4.WAITING?5.TIMED_WAITING?6.BLOCKED
✍绪论
线程主要包括如下六种状态
在任意一个时间点,一个线程只能有且只有其中的一种状态,这6种状态分别如下:
NEW: 安排了⼯作, 还未开始⾏动创建后尚未启动的线程处于这种状态
RUNNABLE: 可⼯作的. ⼜可以分成正在⼯作中和即将开始⼯作.调用start()方法,RUNNABLE包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程有可能正在执行,也有可能正在等待着CPU为它分配执行时间(该线程已经获取了除CPU资源外的其他资源,等待获取CPU 资源后才会真正处于运行状态)。
BLOCKED: 这⼏个都表⽰排队等着其他事情线程被阻塞了,“阻塞状态”与“等待状态”的区别是:“阻塞状态”在等待着获取到一个排他锁,这个事件将在另外一个线程获得锁的时候可能发生,比如synchronized之外;而“等待状态”则是在获得锁之后,主动释放锁,进入等待一段时间,或者等待唤醒动作的发生。
WAITING: 这⼏个都表⽰排队等着其他事情处于这种状态的线程不会被分配CPU执行时间,它们要等待被其他线程显式地唤醒。以下方法会让线程陷入无限期的等待状态:
TIMED_WAITING: 这⼏个都表⽰排队等着其他事情处于这种状态的线程也不会被分配CPU执行时间,不过无须等待被其他线程显式地唤醒,在一定时间之后它们会由系统自动唤醒。以下方法会让线程进入限期等待状态:
TERMINATED: ⼯作完成了.已终止线程的线程状态,线程已经结束执行。
?1.NEW
创建了线程t 但是还未start,获取线程状态
就是NEW
public static void main(String[] args) { Thread t = new Thread(()->{ System.out.println("hello "); }); System.out.println(t.getState()); t.start(); }
?2.TERMINATED
表示线程已经终止了
内核中线程已经销毁了
public static void main(String[] args) throws InterruptedException { Thread t = new Thread(()->{ System.out.println("hello "); }); System.out.println(t.getState()); t.start(); t.join(); //加入join()是为了确保t执行完毕,获取t的状态 System.out.println(t.getState()); }
?3.RUNNABLE
就绪状态
有两种可能
这两种情况,没必要分清楚到底是那种情况。
--------------------
WAITING,TIMED_WAITING,BLOCKED
这三种都是阻塞
不过产生阻塞的原因不同
?4.WAITING
死等进入阻塞
?5.TIMED_WAITING
带有超时时间的阻塞
public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(()->{ while (true){ System.out.println("hello thread"); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } }); thread.start(); thread.join(); //thread.join(60000); }
?6.BLOCKED
带有锁竞争的阻塞
public static void main(String[] args) { Object locker = new Object(); Thread t1 = new Thread(()->{ synchronized (locker){ System.out.println("t1线程开始"); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println("t1线程结束"); } }); Thread t2 = new Thread(()->{ synchronized (locker){ System.out.println("t2线程开始"); System.out.println("t2线程结束"); } }); t1.start(); t2.start(); }
使⽤ jconsole 可以看到 t1 的状态是 TIMED_WAITING , t2 的状态是 BLOCKED
修改代码,将t1中的sleep换成wait
public static void main(String[] args) { Object locker = new Object(); Thread t1 = new Thread(()->{ synchronized (locker){ System.out.println("t1线程开始"); try { locker.wait(); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println("t1线程结束"); } }); Thread t2 = new Thread(()->{ synchronized (locker){ System.out.println("t2线程开始"); System.out.println("t2线程结束"); } }); t1.start(); t2.start(); }
使⽤ jconsole 可以看到 t1 的状态是 WAITING
结论
BLOCKED 表⽰等待获取锁, WAITING 和 TIMED_WAITING 表⽰等待其他线程发来通知.TIMED_WAITING 线程在等待唤醒,但设置了时限; WAITING 线程在⽆限等待唤醒以上就是本文所有内容,如果对你有帮助的话,点赞收藏支持一下吧!???