线程中的LockSapport于线程中断(一)

一、LockSapport与线程中断

1、线程中断机制

1.什么是中断机制

  • 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以Thread.stop()、Thread.suspend()、等都已经废弃。
  • 在java中没有办法立即停止一条线程,然而停止线程却显的尤为重要,如取消一个耗时操作。因此,java提供了一种用于停止线程的协商机制——中断,即为中断标识协商机制
  • 中断只是一种协作协商机制,java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的interrupt方法,该方法也仅仅是将线程对象的中断标识设为true。接着你需要自己写代码检测当前线程的标识位,如果位true,表示别的线程请求这条线程中断。
  • 每个线程对象中都有一个中断标识位,用于表示线程是否被中断,该标识位true表示中断,为false表示未中断;通过调用线程对象的interrupt方法,将该线程标识设为true;可以在别的线程中调用,也可以在自己线程调用。

2、中断机制的三大方法

  • public void interrupt()

    实例方法interrupt()仅仅是设置线程的中断状态为true,发起一个协商不会立刻停止线程

  • public void isInterrupted()

    判断当前线程是否被中断

  • public static void interrupted()

    判断线程是否被中断清除当前中断状态

    1. 返回当前线程的中断状态,测试当前线程是否已被中断
    2. 将当前线程的中断状态清零并重新设为false,清除线程的中断状态

3、面试题中断机制考点

1、如何停止中断运行中的线程?

  1. 通过volatile变量实现

        public static volatile boolean interrupt = false;   
        public static void method1() {
            new Thread(() -> {
                while (true) {
                    if (interrupt) {
                        System.out.println("中断状态程序停止" + interrupt);
                        break;
                    }
                    System.out.println("Hello volatile");
                }
            }).start();
            try {
                TimeUnit.MILLISECONDS.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            interrupt = true;
            System.out.println(Thread.currentThread().getName() + "执行完毕");
        }
    
  2. 通过AtomicBoolean

        public static AtomicBoolean isInterrupt = new AtomicBoolean(false);//原子Boolean 用于操作多线程    
    public static void method2() {
            new Thread(() -> {
                while (true) {
                    if (isInterrupt.get()) {
                        System.out.println("中断状态程序停止" + interrupt);
                        break;
                    }
                    System.out.println("Hello AtomicBoolean");
                }
            }).start();
            try {
                TimeUnit.MILLISECONDS.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    //        interrupt = true;
            isInterrupt.set(true);
            System.out.println(Thread.currentThread().getName() + "执行完毕");
        }
    	
    
    
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汝甚骚吾不及

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值