• 【多线程/JAVA】线程的几种状态总结以及sleep()、wait()方法的区别


    在用IDEA进行多线程编码的时候,会遇到线程的几种状态,分别是:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WATING、TERMINATED。

    NEW:

    名为成功初始化,但尚未执行,从系统层面上来看就是说线程在IDEA上创建了,但还没有通过start方法进行系统调度,此时线程还未出现。

    RUNNABLE:

    名为正在执行,意味着线程通过start已经进行系统调度,也就是说相较于NEW状态,其线程已经创建,并且正在执行,未发生阻塞或结束。

    BLOCKED:

    名为线程发生阻塞,此时阻塞是可能因为两个线程发生了锁竞争,当这两个线程其中一个拿到锁,并且未释放的时候,另一个也想拿这个锁的线程就得发生阻塞等待,所以出现状态为BLOCKED。

    TIMED_WATING

     名为睡眠等待,顾名思义就是调用了Thread类里面的sleep()方法进行了休眠等待,等到括号里面的时间过后,线程就自动被系统唤醒。

    WATING:

    名为等待,当线程调用wait()方法的时候,线程就发生WATING等待。

    TERMINATED:

    名为线程终止,也就是整个线程的调用结束,线程内的任务执行完毕,线程资源被系统回收。

    所以说,当一个线程还没调用start()方法之前,该线程处于NEW状态,在调用start()方法之后并且还在正常执行任务的时候,线程处于RUNNABLE状态,如果线程进行了阻塞,那么线程会在WATIBNG/TIMED_WATING/BLOCKED三个状态下发生阻塞,当任务都被执行完后,线程资源被系统回收,此时线程就是TERMINATED状态,线程结束。

    sleep()与wait()区别小结

    一:sleep()方法是Thread类的一个静态方法,wait()是Object的一个普通方法。

    二:sleep()方法调用后,线程进入TIMED_WAITING状态,wait()方法调用后未被唤醒前是WATING状态。

    三:sleep()方法结束后是系统自动唤醒,wait()如果括号里面不设置时间进行自动唤醒,则需要Object.notify()进行唤醒。

    四:sleep()方法可以在线程的任意地方进行调用,wait()必须在synchronized代码块里面才能出现,并且调用wait()的对象必须要和synchronized锁的对象要一直,而且在进行唤醒的时候,调用notify()的对象也必须和wait()的对象一致。

    五:wait()和notify()可以有效调整线程的执行循序,在多线程里面有着很重要的作用,能很好处理高并发,但是消耗系统资源。sleep()方法虽然能使得线程休眠,但是不能有效控制线程执行顺序。

  • 相关阅读:
    Windows 上下载并提取 Wikipedia
    Autocad绘制的基于工控机的电加热炉的强电电路图
    日常中msvcr120.dll丢失怎样修复?总结5个msvcr120.dll丢失的修复教程
    达梦、Oracle、PostgreSQL查询全部表备注,表字段,全部字段备注,全部索引,全部字段类型
    Android MVI 模式的简单实现(基于kotlin FLow 和 ViewModel)
    【第2天】SQL快速入门-条件查询(SQL 小虚竹)
    常见的http响应状态码(详细)
    如何向Linux内核提交开源补丁?
    王道机试C++第8章递归与分治 Day35和蓝桥杯两道真题程序
    实时目标检测:基于YOLOv3和OpenCV的摄像头应用
  • 原文地址:https://blog.csdn.net/SPMAX/article/details/126187866