JUC多并发编程-->中断机制

中断机制

一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。
java中没有办法立即停止一条线程,但提供了一种停止线程的协商机制–中断,也叫中断标识协商机制

中断只是一种协作协商机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的interrupt方法,该方法也仅仅是将线程对象的中断标识设成true;接着你需要自己写代码不断地检测当前线程的标识位,如果为true,表示别的线程请求这条线程中断,此时究竟该做什么需要你自己写代码实现。
每个线程对象中都有一个中断标识位,用于表示线程是否被中断:该标识位为true表示中断,为false表示未中断:过调用线程对象的interrupt方法将该线程的标识位设为true; 可以在用到的线程中调用,也可以在自己的线程中调用。

中断机制的三大方法
在这里插入图片描述
在需要中断的线程中不断监听中断状态,一旦发生中断,就执行相应的中断处理业务逻辑stop线程
在这里插入图片描述
在这里插入图片描述
不活动的线程不会受影响。
需要在异常处再调用一次interrupt():

  • sleep 方法抛出 InterruptedException后,中断标识也被清空置为 false,我们在catch 没有通过调用 th.interrupt()方法再次将中断标识置为 true,这就导致无限循环了、

t1.interrupted静态方法;t1.isInterrupted实例方法。
二者底层调用的都是isInterrupted()方法,一个传入的是true(需要清除状态),一个传入的是false(不需要清除状态)

LockSupport

用来创建锁和其他同步类的基本线程阻塞原语
park()unpark()分别是阻塞线程和解除阻塞线程

  • wait和notify方法都必须在同步块或者方法里面,且成对出现使用,先wait后notify才可以
  • condition的线程等待必须在锁块里面,先await后signal才可以
  • 线程先要获得或持有锁,必须在锁块中,必须要先等待后唤醒,线程才能被唤醒
    park()unpark()分别是等待和唤醒
    LockSupport类使用了一种名为Permit (许可)的概念来做到阻塞和唤醒线程的功能,每个线程都有一个许可(permit),但与 Semaphore 不同的是,许可的累加上限是1。
  • permit许可证默认没有不能放行,所以一开始调park0方法当前线程就会阻塞,直到别的线程给当前线程的发放permt,pak方法才会被唤醒。
  • 调用unpark(thread)方法后,就会将thread线程的许可证permit发放,会自动唤醒park线程,即之前阻塞中的LockSupport,park0方法会立即返回
  • 不需要在锁块中,不需要顺序

在这里插入图片描述

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值