多线程interrupt()方法

interrupt()方法:配合isInterrupted()方法可以合理打断线程,让线程处理好事务后停止。

打算一个非阻塞状态的线程效果

public class test {
    public static void main(String[] args) {
        Runnable r=()->{
            while (true) {
                boolean interrupted = Thread.currentThread().isInterrupted();
                if (interrupted){
                    System.out.println("料理后事");
                    break;
                }
            }
        };
        Thread t1=new Thread(r);
        t1.start();
        System.out.println("打断前:"+t1.isInterrupted());
        try {
            Thread.sleep(3500);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        t1.interrupt();
        System.out.println("打断后:"+t1.isInterrupted());

    
}
  • 打断前是false,打断后为true

这里说明打断非阻塞线程,打断标记会变为true

打断阻塞中的线程会有什么效果呢?改一下代码再来试试。

public class test {
    public static void main(String[] args) {

        Runnable r=()->{
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                boolean interrupted = Thread.currentThread().isInterrupted();
                if (interrupted){
                    System.out.println("料理后事");
                    break;
                }
            }
        };
        Thread t1=new Thread(r);
        t1.start();
        System.out.println("打断前:"+t1.isInterrupted());
        try {
            Thread.sleep(3500);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        t1.interrupt();
        System.out.println("打断后:"+t1.isInterrupted());

    }

在while循环中,让线程每循环一次就睡眠一秒,保证在睡眠时打断它。

这次线程也被打断,但是没有将打断标记改为true。

总结:
interrupt()不会清除打断标记
如果线程在阻塞中被打断,会抛出InterruptedException异常,如果直接把这个异常向外抛出,就会导致线程终止,而如果捕获了这个异常,自己处理,就不会导致线程终止
打断sleep,wait,join的线程会抛出异常,isInterrupted()获取打断状态为false
可以利用isInterrupted()方法获取打断状态合理打断线程(当某个线程执行了interrupt方法,打断状态则为真)
可以打断lockSupport.park()状态下的线程,打断标记为true是再次park不会生效

posted @ 2024-06-05 21:45  csm~/  阅读(3)  评论(0编辑  收藏  举报