多线程学习笔记七-线程中断interrupt方法

interrupt()
如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个InterruptedException异常。这个时候,我们可以通过捕获InterruptedException异常来终止线程的执行,具体可以通过return等退出或改变共享变量的值使其退出。
isInterrupted()
它会获取当前线程的标志,如果之前调用过thread.interrupt(),那么它的返回值是true。它的作用就是返回该线程是否有中断标志。多次调用这个方法的结果是一样的。
interrupted()
与前面的方法不一样的是,这是一个静态方法,代表着不需要拿到线程对象就可以直接执行,所以它的作用是返回当前线程是否有中断标志。但是它的区别是,当调用这个方法之后,会清除程序的中断标志,就是如果当前线程已中断,第一次调用这个方法的返回值是true,第二次调用这个方法的返回值为false,因为调用方法时,会清除它的中断标志。

1.通过sleep来中断线程

public class SleepInterrupt {
     
    public static void main(String[] args) {
     
        Thread t = new Thread(){
     
            @Override
            public void run() {
     
                while(true){
     
                    try {
     
                        System.out.println("----");
                        Thread.sleep(10); //休眠的是当前线程t
                    } catch (InterruptedException e) {
     
                        System.out.println("收到打断信号");
                        e.printStackTrace();
                        break;
                    }
                }
            }
        };
        t.start();
        System.out.println(t.isInterrupted());
        t.interrupt(); //这里t线程设置中断之后,上面的t线程还在运行,是通过线程中断之后会抛出异常,但是上面t线程没有进行捕获的语句
        System.out.println(t.isInterrupted());
    }
}

多线程学习笔记七-线程中断interrupt方法_第1张图片

2.通过wait方式中断线程

public class WaitInterrupt {
     
    private final static Object monitor= new Object();
    public static void main(String[] args) {
     
        Thread t = new Thread(){
     
            @Override
            public void run() {
     
                while(true){
     
                    synchronized (monitor) {
     
                        try {
     
                            monitor.wait(10); //wait 是t线程
                        } catch (InterruptedException e) {
     
                            System.out.println("收到打断信号");
                            e.printStackTrace();
                            break;
                        }
                    }
                }
            }
        };
        t.start();
        System.out.println(t.isInterrupted());
        t.interrupt(); //这里t线程设置中断之后,上面的t线程还在运行,是通过线程中断之后会抛出异常,但是上面t线程没有进行捕获的语句,通过sleep和wait或者join进行捕获异常
        System.out.println(t.isInterrupted());
    }
}

多线程学习笔记七-线程中断interrupt方法_第2张图片
3.通过join方式中断线程

public class CreateThread4 {
     
    public static void main(String[] args) {
     
        try {
     
            ThreadB b = new ThreadB();
            b.start();
            Thread.sleep(1);
            b.interrupt();
        }catch(Exception e){
     
            e.printStackTrace();
        }
    }
}
class ThreadA extends Thread{
     

    @Override
    public void run() {
     
        for (int i = 0; i < 100000; i++) {
     
            System.out.println(i);
        }
    }
}
class ThreadB extends Thread{
     
    @Override
    public void run() {
     
        try {
     
            ThreadA a = new ThreadA();
            a.start();
            a.join();
            System.out.println("线程B在run end处打印了");
        }catch (Exception e){
     
            e.printStackTrace();
            System.out.println("线程B在catch处打印了");
            return;
        }
    }
}

线程B被中断了,线程A还在运行
多线程学习笔记七-线程中断interrupt方法_第3张图片

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