java中判断线程是否是停止状态

来源:互联网 发布:34周胎儿发育标准数据 编辑:程序博客网 时间:2024/06/07 01:43

Thread.java类里提供了两种方法

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

(2)this.isInterrupted():测试线程是否已经中断。

interrupted()方法声明如下;

public static boolean interrupted()

isInterrupted()方法声明如下:

public boolean isInterrupted()

我们先来看看this.interrupted()方法的解释:测试当前线程是否已经中断,当前线程是指运行this.interrupted方法的线程。我们代码来试验一下:

class MyThread extends Thread{@Override    public void run() {super.run();for(int i=0;i<50000;i++) {System.out.println("i="+(i+1));}}}public class Run {public static void main(String[] args) {try {MyThread thread=new MyThread();thread.start();Thread.sleep(1000);thread.interrupt();//停止thread对象所代表的对象System.out.println("是否停止1?="+thread.interrupted());//判断thread对象所代表的线程是否停止System.out.println("是否停止2?="+thread.interrupted());//判断thread对象所代表的线程是否停止}catch(InterruptedException e) {System.out.println("main catch");e.printStackTrace();}System.out.println("end!");}}

可以看出线程并未停止,这就证明了interrupted()的解释:测试当前线程是否已经中断。这个当前线程是main,他从未中断过。

那么再看下面的代码;

class MyThread extends Thread{@Override    public void run() {super.run();for(int i=0;i<500000;i++) {System.out.println("i="+(i+1));}}}public class Run {public static void main(String[] args) {Thread.currentThread().interrupt();//停止thread对象所代表的对象System.out.println("是否停止1?="+Thread.interrupted());//判断thread对象所代表的线程是否停止System.out.println("是否停止2?="+Thread.interrupted());//判断thread对象所代表的线程是否停止System.out.println("end!");}}

输出结果为:

是否停止1?=true是否停止2?=falseend!
从上述结果来看,方法interrupted()的确判断出当前线程是否是停止状态。但是为啥第二个布尔值是false?查看官方文档中对interrupted()方法的解释;

测试当前线程是否已经中断。线程的中断状态由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回false(第一次调用已清除了其中断状态后,且在第二次调用检验完中断状态前,当前线程再次中断的情况除外。)

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

下面再来介绍isInterrupted()方法。

class MyThread extends Thread{@Override    public void run() {super.run();for(int i=0;i<55000;i++) {System.out.println("i="+(i+1));}}}public class Run {public static void main(String[] args) {try {MyThread thread=new MyThread();thread.start();Thread.sleep(1000);thread.interrupt();System.out.println("是否停止1?="+thread.isInterrupted());//判断thread对象所代表的线程是否停止System.out.println("是否停止2?="+thread.isInterrupted());//判断thread对象所代表的线程是否停止}catch(InterruptedException e) {System.out.println("mian catch");e.printStackTrace();}System.out.println("end!");}}

部分输出结果为;

i=54999i=55000是否停止1?=false是否停止2?=falseend!
可以看出,此方法并未清除状态标志。

在最后再来看下这两个方法的解释:

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

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



原创粉丝点击