博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java线程中的interrupt,isInterrupt,interrupted方法
阅读量:4960 次
发布时间:2019-06-12

本文共 1928 字,大约阅读时间需要 6 分钟。

在java的线程Thread类中有三个方法,比较容易混淆,在这里解释一下 (1)interrupt:置线程的中断状态 (2)isInterrupt:线程是否中断 (3)interrupted:返回线程的上次的中断状态,并清除中断状态

举个例子:

[java]
  1. 用法:  
  2. class MyThread extends Thread {  
  3.     ......  
  4.     ......  
  5.     public void run() {  
  6.         try {  
  7.             while(!Thread.currentThread().isInterrupted()) {  
  8.                 //当达到队列容量时,在这里会阻塞  
  9.                 //put的内部会调用LockSupport.park()这个是用来阻塞线程的方法  
  10.                 //当其他线程,调用此线程的interrupt()方法时,会设置一个中断标志  
  11.                 //LockSupport.part()中检测到这个中断标志,会抛出InterruptedException,并清除线程的中断标志  
  12.                 //因此在异常段调用Thread.currentThread().isInterrupted()返回为false  
  13.                 ArrayBlockingQueue.put(somevalue);   
  14.             }  
  15.         } catch (InterruptedException e) {  
  16.             //由于阻塞库函数,如:Object.wait,Thread.sleep除了抛出异常外,还会清除线程中断状态,因此可能在这里要保留线程的中断状态  
  17.             Thread.currentThread().interrupt();  
  18.         }  
  19.     }  
  20.     public void cancel() {  
  21.         interrupt();  
  22.     }  
  23. }  
  24. 外部调用  
  25. MyThread thread = new MyThread();  
  26. thread.start();  
  27. ......  
  28. thread.cancel();  
  29. thread.isInterrupted();  

用法: class MyThread extends Thread { ...... ...... public void run() { try { while(!Thread.currentThread().isInterrupted()) { //当达到队列容量时,在这里会阻塞 //put的内部会调用LockSupport.park()这个是用来阻塞线程的方法 //当其他线程,调用此线程的interrupt()方法时,会设置一个中断标志 //LockSupport.part()中检测到这个中断标志,会抛出InterruptedException,并清除线程的中断标志 //因此在异常段调用Thread.currentThread().isInterrupted()返回为false ArrayBlockingQueue.put(somevalue); } } catch (InterruptedException e) { //由于阻塞库函数,如:Object.wait,Thread.sleep除了抛出异常外,还会清除线程中断状态,因此可能在这里要保留线程的中断状态 Thread.currentThread().interrupt(); } } public void cancel() { interrupt(); } } 外部调用 MyThread thread = new MyThread(); thread.start(); ...... thread.cancel(); thread.isInterrupted(); 

一般来说,阻塞函数,如:Thread.sleep、Thread.join、Object.wait、LockSupport.park等在检查到线程的中断状态时,会抛出InterruptedException,同时会清除线程的中断状态
对于InterruptedException的处理,可以有两种情况: (1)外层代码可以处理这个异常,直接抛出这个异常即可 (2)如果不能抛出这个异常,比如在run()方法内,因为在得到这个异常的同时,线程的中断状态已经被清除了,需要保留线程的中断状态,则需要调用Thread.currentThread().interrupt()
另外,Thread.interrupted()在jdk库的源代码中比较常用,因为它既可以得到上一次线程的中断标志值,又可以同时清除线程的中断标志,一举两得,但同时也有坏处,就是这个函数有清除中断状态的副作用,不容易理解

转载于:https://www.cnblogs.com/Free-Thinker/p/3440323.html

你可能感兴趣的文章
大图居中,以1920px为例
查看>>
Python3 图片转字符画
查看>>
[C陷阱和缺陷] 第7章 可移植性缺陷
查看>>
人需要治愈
查看>>
linux中configure文件默认执行结果所在位置
查看>>
Windows向Linux上传文件夹
查看>>
20180104-高级特性-Slice
查看>>
6个SQL Server 2005性能优化工具介绍
查看>>
nginx启动、关闭命令、重启nginx报错open() "/var/run/nginx/nginx.pid" failed
查看>>
BZOJ 3097 Hash Killer I
查看>>
UINavigationController的视图层理关系
查看>>
html阴影效果怎么做,css 内阴影怎么做
查看>>
宏观经济
查看>>
综合练习:词频统计
查看>>
BZOJ1026: [SCOI2009]windy数
查看>>
样板操作数
查看>>
64位UBUNTU下安装adobe reader后无法启动
查看>>
iTextSharp带中文转换出来的PDF文档显示乱码
查看>>
组件:slot插槽
查看>>
走进C++程序世界------异常处理
查看>>