线程中断的三个方法的区别(interrupt/isInterrupted/interrupted)-总结自Java编程之美

方法定义

  • void interrupt():中断调用该方法的实例线程对象。当线程A正在运行时,线程B调用了线程A的interrupt方法后,就会给线程A设置中断标志为true,并且返回。

    设置中断标志仅仅只是设置中断标志,线程A的运行并没有没中断,它会继续往下执行。如果线程A因为调用了wait系列函数、join方法或者sleep方法而被阻塞挂起,这时候线程B调用了线程A的interrupt方法,线程A就会在调用这些方法的地方抛出InterruptedException异常。

    public static void main(String[] args) throws InterruptedException {Thread threadOne = new Thread(() -> {System.out.println("threadOne begin sleep 2000s");try {Thread.sleep(2000 * 1000);} catch (InterruptedException e) {System.out.println("threadOne is interrupted when sleeping");return;}System.out.println("threadOne end sleep 2000s");});threadOne.start();Thread.sleep(1000);// 线程threadOne处于sleep状态,调用interrupt方法,线程threadOne抛出异常被catch捕获到返回threadOne.interrupt();threadOne.join();System.out.println("main thread is over");
    }
    

    控制台输出:

    threadOne begin sleep 2000s
    threadOne is interrupted when sleeping
    main thread is over
    
  • boolean isInterrupted():检测调用该方法的实例线程对象是否被中断,如果是返回true,反之返回false。

    public boolean isInterrupted() {return isInterrupted(false);
    }
    
  • boolean interrupted():检测当前方法调用所在的线程是否被中断,如果是则清除中断标志并且返回true,反之返回false。该方法为static,可以通过Thread类直接调用。

    public static boolean interrupted() {return currentThread().isInterrupted(true);
    }
    

三者作用的对象区别:

interrupt:当前调用该方法的实例线程对象(如下例中代表threadOne线程)

isInterrupted:作用的对象和interrupt方法一致

interrupted:当前调用该方法所在的线程(如下例中代表main线程)

public static void main(String[] args) throws InterruptedException {Thread threadOne = new Thread(() -> {System.out.println("threadOne begin...");for (;;) {}});threadOne.start();Thread.sleep(1000);// 给threadOne线程设置中断标志threadOne.interrupt();// 判断threadOne线程是否中断System.out.println(threadOne.isInterrupted());//判断调用该方法的线程是否处于中断状态(也就是main线程)System.out.println(threadOne.interrupted());//判断调用该方法的线程是否处于中断状态(也就是main线程)System.out.println(Thread.interrupted());// 判断threadOne线程是否中断System.out.println(threadOne.isInterrupted());// 阻塞main线程,等待threadOne执行完毕继续执行threadOne.join();System.out.println("main thread is over");
}

控制台输出:

threadOne begin...
true
false
false
true

补充:

证实interrupted()方法能清除中断标志

public static void main(String[] args) throws InterruptedException {Thread threadOne = new Thread(() -> {System.out.println("threadOne begin...");// 判断是否中断,如果为true则清除中断标志,并且跳出循环while (!Thread.interrupted()) {}System.out.println("threadOne isInterrupted: " + Thread.currentThread().isInterrupted());});threadOne.start();Thread.sleep(5000);// 给threadOne线程设置中断标志threadOne.interrupt();// 阻塞main线程,等待threadOne执行完毕继续执行threadOne.join();System.out.println("main thread is over");
}

控制台输出:

threadOne begin...
threadOne isInterrupted: false
main thread is over

线程中断的三个方法的区别(interrupt/isInterrupted/interrupted)相关推荐

  1. unix c线程同步的三种方法:互斥量、读写锁以及条件变-xhb8413-ChinaUnix博客

    unix c线程同步的三种方法:互斥量.读写锁以及条件变-xhb8413-ChinaUnix博客 unix c线程同步的三种方法:互斥量.读写锁以及条件变 2012-03-30 14:42:38 分类 ...

  2. java线程 yield_Java线程中yield与join方法的区别

    长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...

  3. 在 C# 中,(int) ,Int32.Parse() 和 Convert.toInt32() 三种方法的区别

    在 C# 中,(int),Int32.Parse() 和 Convert.toInt32() 三种方法有何区别? int 关键字表示一种整型,是32位的,它的 .NET Framework 类型为 S ...

  4. 关闭线程的的三种方法

    Java 之前有个api函数可以直接关闭线程, stop(), 后来, 取消了. 其替代的方式主要有两种: 1. 自己加入一个成员变量, 我们在程序的循环里面, 轮流的去检查这个变量,  变量变化时, ...

  5. js--《js缓存的三种方法及区别与特点》

    js缓存的三种方法与特点: ①H5本地存储sessionStrong: sessionStrong:临时的会话储存,只要当前的会话窗口未关闭,存储的信息就不会丢失,即使页面刷新或在编辑器中更改代码,存 ...

  6. 在matlab中怎样安装dh包,建立DH模型的三种方法以及区别

    目录 1.建立DH模型的三种方法 2.SDH和MDH的应用范围 3. SDH和MDH的区别 0.SDH是ZX类变换,MDH是XZ类变换 1.SDH和MDH都是强调把坐标系建立在连杆上 2.举个例子说明 ...

  7. JQ中val(),html(),text()三种方法的区别

    JQ中val(),html(),tex()三种方法的区别是内容不一样 text(参数); 有参数是改变他的文本,无值是获取他的文本 var(); 有参数是改变他的val属性,无值是获取他的val属性 ...

  8. Callable接口-创建线程的第三种方法

    Callable和Runable相比 //Runnable和Callable区别 //1.Callable带返回值 //2.run()不会抛异常,call()会抛异常 //3.实现的接口不同 pack ...

  9. 线程run方法和start方法的区别

    区别 run() 只是一个普通的方法调用,不会开启新的线程. start() 会开启新的线程,分配新的资源.里面的变量互不影响. 实例 package multithreading;public cl ...

最新文章

  1. 网站建设很简单,想要成功却很难
  2. 大数据风控之贷前调查必知的十大客户信息
  3. zoj 2874 amp; poj 3308 Paratroopers (最小割)
  4. 【学习笔记】 Python - Pandas
  5. java吧王者_java单排上王者!(一) java内存
  6. [安卓] 9、线程、VIEW、消息实现从TCP服务器获取数据动态加载显示
  7. 北大教授:到底什么才是有效的教育?
  8. web页面的回流,认识与避免
  9. 《Java开发实战经典》 —— 视频列表
  10. 13 款免费但好用到哭的项目管理工具
  11. 微信小程序——手机号登录
  12. 深信服python二面面什么_深信服 python开发 北京 笔试一面二面 面经
  13. 拉钩招聘信息爬取以及可视化
  14. 真的!?在阅读体验感上赢过微信读书?
  15. 20P41 Premiere预设450+Luts现代时尚经典黑白VHS复古电影迷幻冷酷热色彩调色预设集合
  16. Iphone5 图片适配
  17. lg android tv刷机,LG TV Remote-webOS
  18. 快收藏!高手Linux运维管理必备工具大全,你会吗?
  19. 外贸品牌企业邮箱哪个好用?
  20. 2021-11-21 根据身高 体重计算出bmi指数,检测自己是否属于肥胖

热门文章

  1. 解决win10系统无法打开截图工具
  2. PMP项目管理证书过期了还可以续证吗?
  3. mapbox 使用antv/l7添加下雨效果
  4. 腾讯云如何做“智慧零售”?这些服务你应该了解下
  5. 用python实现一个【简易记事本】吧
  6. Oracle EBS Interface/API(18) - 标准采购订单、PBA和一揽子发放等等审批API
  7. 3.2 Python图像的频域图像增强-高通和低通滤波器
  8. 2020年高级工程师职称评审必备条件!
  9. 【巴比伦周报】2019第3周
  10. 腾讯空间、新浪微博、腾讯微博登录接口的使用