• Thread常用方法介绍


    yield()方法

    public static native void yield();
    
    • 1

    静态的native方法。用于交出当前线程的CPU执行权,使线程变为就绪状态,等待下一次获得CPU执行权,再执行线程中业务。下面是JDK对这个方法的注释:

    很少适合使用这种方法。它可能对调试或测试有用,因为它可能有助于重现由于竞争条件导致的错误。在设计并发控制结构时,它可能也很有用。如java.util.concurrent.locks包。

    由此可知该方法的使用场景很少

    join()方法

    等待调用对象线程执行完后,再往下执行主线程的代码。这个方法可以使多个线程同步执行。例如,在A线程业务中,获得B线程对象,然后B线程对象调用join()方法。那么A线程就会阻塞在B.join()代码处,等B线程执行完后,A线程才继续往下执行。

    停止线程的相关方法

    stop()方法

    强制杀死线程,类似于linux中kill-9 杀死进程的效果,不安全,已被jdk标为弃用方法。

    interrput()方法

    相对应的方法有三个,分别为:

    interrupt():
    给线程标记一个状态位,表示该线程可以终止了,而不是终止这个线程。

    isInterrupted():
    判断线程是否被打了可中断的标志位,通过这个方法,来对可中断的线程做进一步处理,例如释放资源等操作,让线程安全终止退出。

    (static) interrupted():
    静态方法,返回线程是否有可中断标志,并且将可中断标志改为false。这个方法会修改线程的可中断标志状态为false。用于判断线程是否可中断,如果可中断,状态改为不可中断状态,并且做一些业务逻辑处理。

    这种通过给线程设置标识的方式来停止线程的方法,称之为协作式并发编程

    wait()方法

    相关方法包括wait()方法、notify()方法、notifyAll()方法。需要注意的是,这三个方法并不是Thread类的方法,而是Object类的方法。原因是这三个方法,只能用在synchroinzed同步代码块中,需要由同步代码块的锁对象来调用。而任何对象都可以充当锁对象,所以只能将这三个方法设计到Object类中。
    这几个方法的作用就是,当一个线程抢到锁后,而这个线程又不满足执行逻辑,则调用锁对象.wait()方法,来释放锁,释放锁后,其他线程抢到这把锁,执行完逻辑,并调用锁对象.notify或notifyAll方法,通知wait()方法继续往下执行。等wait方法抢占到CPU资源后,就继续往下执行了。notify和notifyAll方法不会释放锁,只有等同步代码块执行完后才释放锁。wait方法会释放锁。

    关于InterrputException的理解

    在某个线程进入sleep()、await()等阻塞方法时,如果在其他线程中,调用这个线程对象的interrput()方法,对线程进行中断,则这个线程中正在执行的sleep()等阻塞方法就会抛出InterrputException异常,并且把线程的interrput状态标志为false。
    JDK如此设计的用意是为了进行阻塞线程的人为中断。例如,当一个线程sleep()很长时间,但是想停止这个线程的中断应该怎么办呢?那就在其他线程中获取到这个正在阻塞的线程,然后调用interrupt()方法,这个线程就不再阻塞,而是抛出InterrputException异常,在catch代码块,对异常进行处理。

    线程状态

    老生常谈的问题,不再过多解释,一张图完事儿:
    在这里插入图片描述

  • 相关阅读:
    【算法】折半查找解析
    音视频八股文(11)-- ffmpeg 音频重采样
    SkyWalking使用讲解
    记-flink sink to pg卡住且日志没有报错问题排查【参数引起】
    docker拉取镜像错误missing signature key
    【代码随想录算法训练Day51】LeetCode 115.不同的子序列、LeetCode 583. 两个字符串的删除操作、LeetCode 72. 编辑距离
    nacos -- 下载 启动 登录
    python 使用ctypes加载(C/C++)动态库
    从一到无穷大 #16 ByteSeries,思考内存时序数据库的必要性
    Hive使用Tez引擎的好处
  • 原文地址:https://blog.csdn.net/qq1309664161/article/details/127587745