- 判断是否已经被中断的方法
- 判断是否已经被中断demo
关于线程状态的方法, 有如下的三个. 返回值都是布尔类型 其中两个为static静态的方法.
方法一和方法二都是返回线程的中断状态, 区别在于 , 方法一除了会把线程的中断状态返回之外, 还会把线程的中断状态设置为false. 会清除线程的中断状态. 如下的源码所示, isInterrupted传入true 代表清除线程的中断状态.
//方法一
public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
//方法二
public boolean isInterrupted() {
return isInterrupted(false);
}
//方法三
public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
判断是否已经被中断demo
对于上面的方法一和方法二, 有如下的代码示例. 主要的流程是启动了一个子线程, 并且给出了中断的信号.
在打印语句中, 判断是否被中断了.
package com.thread.stopthreads;
/**
* 类名称:RightWayInterrupted
* 类描述: 注意Thread.interrupted()方法的目标对象是“当前线程”,而不管本方法来自于哪个对象
*
* @author: https://javaweixin6.blog.csdn.net/
* 创建时间:2020/8/29 10:23
* Version 1.0
*/
public class RightWayInterrupted {
public static void main(String[] args) throws InterruptedException {
Thread threadOne = new Thread(new Runnable() {
@Override
public void run() {
for (; ; ) {
}
}
});
// 启动线程
threadOne.start();
//设置 子线程的中断标志
threadOne.interrupt();
//获取中断标志 此方法不会清除中断状态
System.out.println("isInterrupted: " + threadOne.isInterrupted());
//获取中断标志并重置 此方法会清除中断状态
System.out.println("isInterrupted: " + threadOne.interrupted());
//获取中断标志并重直 main线程 此方法会清除中断状态
System.out.println("main isInterrupted: " + Thread.interrupted());
//获取中断标志
System.out.println("isInterrupted: " + threadOne.isInterrupted());
threadOne.join();
System.out.println("Main thread is over.");
}
}
关键代码如下图. 根据逻辑分析 , 第一个打印语句, 只是判断子线程是否被中断了, 由于上面给出了中断的信号, 那么肯定是返回true的. 但是第二个语句, 是给出是否中断 , 并且把中断信号清除的. 但是第一个方法只是给出状态, 没有清除中断, 所以应该也是返回true 第三个语句是判断main线程是否被中断, 由于没有给main线程中断信号,所以应该是返回false. 第四个语句, 判断子线程是否被中断, 由于第二个线程清除了中断信号, 所以应该返回false. 但是实际的打印语句如下, 第二个打印语句, 却是false , 第四个打印语句却是true .
这是由于 ,
public static boolean interrupted()
这个静态方法的目标对象是“当前线程”,而不管本方法来自于哪个对象. 虽然本方法来自于子线程的调用, 但是目标对象的当前线程是main线程, 由于main线程是没有给出中断信号的, 所以返回的是false. 第四个打印语句, 由于子线程的中断状态其实是一直都没有被清除掉的, 因此返回的是true.