一.简述
interrupt()不会中断一个正在运行的线程。方法实际完成的是:在线程受到阻塞时抛出一个中断信号,线程就得以退出阻塞的状态。
更确切的说,
如果线程被Object.wait,Thread.join,Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。、
如果线程没有被阻塞,这时调用interrupt()将不起作用。
线程A在执行sleep,wait,join时,线程B调用A的interrupt方法,的确这个时候A线程会有InterruptedException异常抛出来,但其实这是在sleep,wait,join这些方法内部不断的检查中断状态的值,而自己抛出的InterruptedException异常。
如果线程A正在执行一些指定的操作(如赋值、for、while、if、调用方法等)时,就不会去检查中断状态,所以线程A也就不会抛出InterruptedException异常,而会一直执行着自己的操作。当线程A执行到wait(),sleep(),join()时,就会马上抛出InterruptedException异常。
二.场景和使用方法
public class InterruptedTest {
public static void main(String[] args) {
MyThread_1 t1=new MyThread_1();
MyThread_1 t2=new MyThread_1();
t2.setPriority(Thread.MAX_PRIORITY);
t2.setPriority(Thread.MIN_PRIORITY);
t1.start();
t1.interrupt();
System.out.println("111");
//t1.start();
//t1.interrupt();
}
}
class MyThread_1 extends Thread
{
public void run()
{
int a;
try {
for(int i=0;i<10000;i++)
{
a=i*i;
System.out.println(i);
}
System.out.println("step_1");
//interrupt();
sleep(5000);
System.out.println("step_2");
}
catch(InterruptedException e) {
System.out.println("InterruptedException");
}
catch (Exception e)
{
}
}
}
中断是强行终止的,所以会抛出异常,针对长时间sleep(),wait可以得到有效的终止