interrupt(),interrupted() 和 isinterrupted() 的区别
来源:互联网 发布:淘宝紫砂壶店铺 编辑:程序博客网 时间:2024/06/06 09:55
尊重他人劳动成果,转载请注明出处:
http://blog.csdn.net/czd3355/article/details/72026825
1. 结论先行
interrupt():将调用该方法的对象所表示的线程标记一个停止标记,并不是真的停止该线程。是一个实例方法。
具体中断线程的方法请看我这篇文章。中断线程的方法interrupted():测试当前线程的中断状态,并且会清除线程的状态标记。是一个是静态方法。这里的当前线程是指运行该方法的线程
isInterrupted():测试调用该方法的对象所表示的线程,不会清除线程的状态标记。是一个实例方法。
现在对各方法逐一进行具体介绍:
2. interrupt()
首先我们来使用一下 interrupt() 方法,观察效果,代码如下:
public class MainTest { @Test public void a() { try { MyThread01 myThread = new MyThread01(); myThread.start(); myThread.sleep(2000); myThread.interrupt(); } catch (Exception e) { System.out.println("main catch"); e.printStackTrace(); } }}public class MyThread01 extends Thread { @Override public void run() { super.run(); for (int i = 0; i < 500; i++) { System.out.println("i= " + i); } }}
输出结果:
可以看出,子线程已经执行完成了。说明 interrupt() 方法是不能让线程停止,和我们一开始所说的那样,它仅仅是在当前线程记下一个停止标记而已。那么这个停止标记我们又怎么知道呢?——此时就要介绍下面的 interrupted() 和 isInterrupted() 方法了。
3. interrupted() 和 isInterrupted()
interrupted() 方法的声明为
public static boolean interrupted()
isInterrupted() 方法的声明为
public boolean isInterrupted()
这两个方法很相似,下面我们用程序来看下使用效果上的区别吧
先来看下使用 interrupted() 的程序。
@Testpublic void b() { try { MyThread01 myThread = new MyThread01(); myThread.start(); myThread.sleep(1000);// 等价于 Thread.Interrupted()。因为该方法判断是运行此行代码的线程是否为停止状态。所以 xxx.Interrupted() 的结果都是一样的。 myThread.interrupt();// Thread.currentThread().interrupt(); // Thread.currentThread() 这里表示 main 线程 System.out.println("是否中断1 " + myThread.interrupted()); System.out.println("是否中断2 " + myThread.interrupted()); } catch (InterruptedException e) { System.out.println("main catch"); e.printStackTrace(); } System.out.println("main end");}
输出结果:
由此可以看出,线程并未停止,同时也证明了 interrupted() 方法的解释:测试当前线程是否已经中断,这个 “当前线程” 就是 main,它从未中断过,所以打印结果都是 false。
那么如何使 main 线程产生中断效果呢?将上面第八行代码注释掉,并将第九行代码的注释去掉再运行,我们就可以得到以下输出结果:
从结果上看,方法 interrupted() 的确判断出了当前线程(此例为 main 线程)是否是停止状态了,但为什么第二个布尔值为 false 呢?我们在最开始的时候有说过——“interrupted() 测试当前线程是否已经是中断状态,执行后会将状态标志清除。”
因为执行 interrupted() 后它会将状态标志清除。也就是说,interrupted() 具有清除状态标记功能。
在第一次调用时,由于此前执行了 Thread.currentThread().interrupt();
,导致当前线程被标记了一个中断标记,因此第一次调用 interrupted() 时返回true。因为 interrupted() 具有清除状态标记功能,所以在第二次调用 interrupted() 方法时会返回 false。
以上就是 interrupted() 的介绍内容,最后我们再来看下 isInterrupted() 方法吧。其实对比已经很明显了,isInterrupted() 和 interrupted() 相比不具有清除状态标记功能。
修改一下上面的代码:
@Test public void b() { try { MyThread01 myThread = new MyThread01(); myThread.start(); myThread.sleep(1000); myThread.interrupt(); // 修改了下面这两行。 // 上面的代码是 myThread.interrupted(); System.out.println("是否中断1 " + myThread.isInterrupted()); System.out.println("是否中断2 " + myThread.isInterrupted()); } catch (InterruptedException e) { System.out.println("main catch"); e.printStackTrace(); } System.out.println("main end"); }
输出结果:
结果很明显,因为 isInterrupted() 不具有清除状态标记功能,所以两次都输出 true。
参考文章:http://www.cnblogs.com/hapjin/p/5450121.html
- 【Java】interrupt、interrupted和isInterrupted的区别
- JAVA interrupt、interrupted和isInterrupted的区别
- interrupt(),interrupted() 和 isinterrupted() 的区别
- java---interrupt、interrupted和isInterrupted的区别
- interrupt、interrupted和isInterrupted的区别
- interrupt、interrupted和isInterrupted的区别
- interrupt、interrupted和isInterrupted的区别
- interrupt、interrupted 、isInterrupted 区别
- interrupt、interrupted 、isInterrupted 区别
- interrupt、interrupted 、isInterrupted 区别
- interrupt、interrupted 、isInterrupted 区别
- interrupt,interrupted和isInterrupted
- interrupt(), isInterrupted(), interrupted() 方法的区别
- 关于interrupt,interrupted和isInterrupted的理解
- interrupted()和isInterrupted()的区别
- interrupted() 和 isInterrupted() 的区别
- interrupt(),interrupted() 和isInterrupted()使用
- 分享一个:interrupt、interrupted和isInterrupted的区别,写的很好
- 4.4 WINDOWS SERVER 2008
- 欢迎使用CSDN-markdown编辑器
- (三)请求响应
- LeetCode刷题(C++)——Rotate List(Medium)
- 数据库——数据冗余与数据类型
- interrupt(),interrupted() 和 isinterrupted() 的区别
- traincascade训练报错:Train dataset for temp stage can not be filled.
- HashMap集合的遍历
- HTTP 500-Unable to compile class for JSP的解决方法
- Ubuntu 删除安装软件
- 《java设计模式》:装饰者模式
- SAP HANA XS ODATA使用参数展示数据结构
- 动态规划测试test20170511
- QStringList用法总结