关于interrupt,interrupted和isInterrupted的理解

来源:互联网 发布:阿里云 docker 加速 编辑:程序博客网 时间:2024/06/05 03:51

(1)interrupt:

调用interrupt()方法来停止线程,不会马上终止,它仅仅是在当前的线程中打了一个停止的标记。即不会影响线程的正常运行,只是该线程多了一个停止的标记而已。

(2)interrupted:

测试的是当前线程是否处于中断状态,是一个静态方法,在一次执行后具有将状态标志清除为false的状态。即连续两次调用该方法后,第二次调用则会返回false。源码如下:


(3)isInterrupted:

测试的是调用该方法的线程是否处于中断状态,是一个实例方法,不会清除状态标志。源码如下:


实例:

MyThread1.java

public class MyThread1 extends Thread{//@Overridepublic void run(){super.run();for(int i=0;i<500000;i++){System.out.println("i="+(i+1));}}}
Run1.java

写了一下代码进行测试。

public class Run1 {public static void main(String[] args){/* * 此程序里面有3个线程,即thread,t1和main. *  */MyThread1 thread=new MyThread1();        Thread t1=new Thread(thread);thread.start();t1.start();try {Thread.sleep(1000);System.out.println(Thread.currentThread().getName());//thread.interrupt();//t1.interrupt();//Thread.currentThread().interrupt();System.out.println("是否停止0?"+Thread.currentThread().interrupted());System.out.println("是否停止1?"+thread.interrupted());System.out.println("是否停止2?"+thread.isInterrupted());System.out.println("是否停止3?"+t1.interrupted());System.out.println("是否停止4?"+t1.isInterrupted());} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("end");}}

(1)此时没有任何的中断,所以输出结果均为false。

(2)若把Thread.currentThread().interrupt();加到代码中,结果为0为true,1,2,3和4为false。首先,因为interrupted()测试的是当前线程的状态,而当前线程的状态已经发生了中断,所以为true,但是又因为interrupted()有清除状态的功能,所以其他调用该方法的结果都是false。

(3)若把thread.interrupt();加到代码中,结果为0,1,3,4是false,2为true。因为isInterrupted()测试的是调用该方法的线程的状态。因此只有2为true。

(4)若把t1.interrupt()加到代码中,结果为0,1,2,3为false,4为true。原因同上。



阅读全文
0 0