• 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代码块,对异常进行处理。

    线程状态

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

  • 相关阅读:
    图解LeetCode——793. 阶乘函数后 K 个零(难度:困难)
    C++ 多态
    安阳旅游地图规划(未完成)
    JS函数防抖和节流全解析
    带你造轮子,自定义一个随意拖拽可吸边的View
    vscode ssh 免密连接
    LeetCode·304竞赛·6132·使数组中所有元素都等于零·模拟·哈希
    [论文阅读] Multimodal Unsupervised Image-to-Image Translation
    Spark RDD惰性计算的自主优化
    一个快速切换浏览器搜索引擎的小技巧(在地址栏搜索B站、书签等的方法)
  • 原文地址:https://blog.csdn.net/qq1309664161/article/details/127587745