栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JAVA线程 -- Interrupt

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JAVA线程 -- Interrupt

Interrupt相关方法 Interrupt方法
public void interrupt()

interrupt方法用来设置线程打断标志,但不会修改线程的运行状态

isInterrupted方法
public boolean isInterrupted()

实例方法,用来获取线程是否被设置打断标志

interrupted方法
public static boolean interrupted()

静态方法,用来获取进程打断标志,同时会清除打断标志

Interrupt与sleep/wait

线程sleep过程中如果被打断,会抛出异常 InterruptedException,sleep会提前结束,并且此时线程的打断标志会被清除。如果需要在被打断时做出响应,可以捕获异常后处理。

public class InterruptSleep {
    public static void main(String[] args) {
        Thread t  = new Thread(() -> {
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                System.out.println("catch interrupted exception ");
                System.out.println(Thread.currentThread().isInterrupted());
            }
        });

        t.start();
        SleepHelper.sleep(1000);
        t.interrupt();
    }
}

wait的效果和sleep很相似。

interrupt与synchronized

interrupt无法干扰正在阻塞等待 synchronized 锁的线程

public class InterruptSynchronized {
    static Object o = new Object();
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            synchronized (o) {
                System.out.println("thread got lock");
            }
        });

        new Thread(() -> {
           synchronized (o) {
               SleepHelper.sleep(10000);
           }
        }).start();

        SleepHelper.sleep(1000);
        t.start();
        t.interrupt();
    }
}

interrupt与lock

interrupt无法打断等待lock锁的线程

public class InterruptLock {
    static Lock lock = new ReentrantLock();
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            try {
                lock.lock();
                System.out.println("t got lock");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        });

        new Thread(() -> {
           lock.lock();
           SleepHelper.sleep(10000);
           lock.unlock();
        }).start();

        SleepHelper.sleep(1000);
        t.start();
        t.interrupt();
    }
}

如果需要线程等待锁的过程中可以被打断,使用 lockInterruptibily

public class InterruptLock {
    static Lock lock = new ReentrantLock();
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            try {
                lock.lockInterruptibly();
                System.out.println("t got lock");
            } catch (Exception e) {
                System.out.println("t got interrupted");
            } finally {
                lock.unlock();
            }
        });

        new Thread(() -> {
           lock.lock();
           SleepHelper.sleep(10000);
           lock.unlock();
        }).start();

        SleepHelper.sleep(1000);
        t.start();
        t.interrupt();
    }
}

小结

interrupt可以通过设置线程的中断状态来达到通知的目的,具体是否需要做出响应可以视情况而定。比如想在线程外部终止线程的执行而又不破坏数据一致性,比如多线程争抢锁并操作数据的情况,可以利用interrupt来通知线程,线程内部通过中断状态来优雅的终止,而不是强制杀死线程。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/778612.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号