zoukankan      html  css  js  c++  java
  • java 多线程5: java 终止线程及中断机制 (stop()、interrupt() 、interrupted()、isInterrupted())

    JAVA中有3种方式可以终止正在运行的线程

    ①线程正常退出,即run()方法执行完毕了

    ②使用Thread类中的stop()方法强行终止线程。但stop()方法已经过期了,不推荐使用

    ③使用中断机制interrupt()


    1.stop()方法

    stop()在java多线程中已经废弃

    1.stop()方法会导致释放锁的不良后果,数据不完整

    比如一个上锁了得方法:

    threadA线程拥有了监视器,这些监视器负责保护某些临界资源,比如说银行的转账的金额。当正在转账过程中,main线程调用 threadA.stop()方法或者this.stop()。结果导致监视器被释放,其保护的资源(转账金额)很可能出现不一致性。比如,A账户减少了100,而B账户却没有增加100,没有保证数据原子性

    2.当线程调用stop()方法时,会立刻终止线程的所有操作,并抛出ThreadDeath异常,通常不需要捕捉




    2.interrupt() 中断机制

    这个方法是实例方法 ,但是它不会真的中断一个正在运行的线程,而是给线程打一个停止的标记,还需要配合判断来优雅的终止线程



    运行代码



    输出结果



    可以看的出来  ,interrupt() 并不会真正的停止正在运行的线程,那么如何停止线程呢


    3.判断线程的停止状态

    interrupted()方法与 isInterrupted()方法能反映当前线程的终止状态




    看的出来 interrupted() 是静态方法 而 isInterrupted() 是实例方法


    1.interrupted()方法






    可以从上面看出 interrupt() 执行了线程   interrupted() 方法 第一调用返回是true , 第二次调用返回时false,在这里查看interrupted()的源码发现该方法会清楚中断状态


    1. public boolean isInterrupted() {
    2. return isInterrupted(false);
    3. }
    4. /**
    5. * Tests if some Thread has been interrupted. The interrupted state
    6. * is reset or not based on the value of ClearInterrupted that is
    7. * passed.
    8. */
    9. private native boolean isInterrupted(boolean ClearInterrupted);

    源码发现该方法interrupted() 会调用 isInterrupted 方法 传入 参数clean 状态,调用改方法,改方法内部会清除中断状态

    2. isInterrupted()方法

    继续根据上面的示例创建 Run3



    总结了两个判断线程中断的区别  , 下面开始优雅的中断线程了



  • 相关阅读:
    Android文字上下滚动
    Java怎么去除字符串中的多个空白【split(" ")与split("\s+")】
    Java:Scanner.nextLine()和Scnner.next()的区别,以及多条nextLine()输入问题的解决方法
    SQL server报错18456(又名SQL server怎么用sa登入)
    Android Studio快速自动生成findViewById
    java.sql.Date和java.util.Date的联系与区别【转载】
    Linux Crontab 不执行
    PostgreSQL 全量 增量 归档 备份工具 pg_rman介绍与使用(转载)
    Rman备份的保留策略(retention policy) (转载)
    Oracle RMAN block_change_tracking(块更改追踪)
  • 原文地址:https://www.cnblogs.com/signheart/p/a4af04f73f00ddb74a61d82d77355fa5.html
Copyright © 2011-2022 走看看