关于interrupt,interrupted和isInterrupted的理解

(1)interrupt:

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

(2)interrupted:

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


(3)isInterrupted:

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


实例:

MyThread1.java

public class MyThread1 extends Thread{
//	@Override
	public 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 block
			e.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。原因同上。



你可能感兴趣的:(JAVA多线程)