Bootstrap

java线程,interruped()和isInterrupted()

 

首先看一下中文解释及API实现:

1) interrupted():测试当前线程是否已中断。

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

是静态方法,属于类。

2)isInterrupted():测试线程是否已中断

public boolean isInterrupted() {
    return isInterrupted(false);
}

是非静态方法,属于对象。

代码测试1:

public class MyThread extends Thread {

    @Override
    public void run() {
        super.run();
        System.out.println("我是线程中的方法,已经执行了!");
    }
}
public class TestRun {
    public static void main(String[] args) {
        try {
            MyThread myThread = new MyThread();
            myThread.start();
            Thread.sleep(1000);
            myThread.interrupt();
            System.out.println("是否停止1(静态)? =" + Thread.interrupted() );
            System.out.println("是否停止2(静态)? =" + Thread.interrupted() );
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

结果:

interrupted()方法的确是测试当前线程是否中断,此时,“当前线程”是main,它没有中断,故结果是false。

代码测试2:

将上述TestRun类中的main代码进行修改,如下,

public class TestRun {
    public static void main(String[] args) {
            Thread.currentThread().interrupt();
            System.out.println("是否停止1(静态)? =" + Thread.interrupted() );
            System.out.println("是否停止2(静态)? =" + Thread.interrupted() );
            System.out.println("结束!");

}

结果:

第一个是true,第二个是false,why? 

测试当前线程是否中断。 该方法可以清除线程的中断状态 。 换句话说,如果这个方法被连续调用两次,那么第二个调用将返回false(除非当前线程再次中断,在第一个调用已经清除其中断状态之后,在第二个调用之前已经检查过)。

interrupted()方法具有清除状态的功能,所以第二次调用返回值是false。

再来看另外一个方法,isInterrupted():

public class MyThread extends Thread {

    @Override
    public void run() {
        super.run();
        for(int i=0; i<500000; i++){
            if(this.isInterrupted()){
                break;
            }
            System.out.println("i=" + (i+1));
        }
        
        System.out.println(Thread.currentThread().getName() + "线程即将停止!");
    }
}
public class TestRun {

    public static void main(String[] args) {
        try {
            MyThread myThread = new MyThread();
            myThread.start();
            Thread.sleep(1000);
            myThread.interrupt();

            System.out.println("是否停止1(非静态)? =" + myThread.isInterrupted() );
            System.out.println("是否停止2(非静态)? =" + myThread.isInterrupted() );
            System.out.println("结束!");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

运行结果如下:

此时,两次输出都是true,故说明isInterrupted()方法不会清除状态标志。

总结:

1、Thread.interrupted():测试当前线程是否已经是中断状态,执行该方法后具有将状态标志清除为false的功能。

2、this.isInterrupted():测试线程对象是否已经是中断状态,但是不会清除状态标志。

 

;