zoukankan      html  css  js  c++  java
  • Java阻塞中断和LockSupport

    在介绍之前,先抛几个问题。

    1. Thread.interrupt()方法和InterruptedException异常的关系?是由interrupt触发产生了InterruptedException异常?
    2. Thread.interrupt()会中断线程什么状态的工作? RUNNING or BLOCKING?
    3. 一般Thread编程需要关注interrupt中断不?一般怎么处理?可以用来做什么?
    4. LockSupport.park()和unpark(),与object.wait()和notify()的区别?
    5. LockSupport.park(Object blocker)传递的blocker对象做什么用?
    6. LockSupport能响应Thread.interrupt()事件不?会抛出InterruptedException异常?
    7. Thread.interrupt()处理是否有对应的回调函数?类似于钩子调用?

    如果你都都能很明确的答上来了,说明你已经完全懂Thread.interrupt,可以不用往下看那了。

    那如果不清楚的,带着这几个问题,一起来梳理下。
    Thread的interrupt处理的几个方法:
    • public void interrupt() :  执行线程interrupt事件
    • public boolean isInterrupted() : 检查当前线程是否处于interrupt
    • public static boolean interrupted() : check当前线程是否处于interrupt,并重置interrupt信息。类似于resetAndGet()
    理解:
    1. 每个线程都有一个interrupt status标志位,用于表明当前线程是否处于中断状态
    2. 一般调用Thread.interrupt()会有两种处理方式
    • 遇到一个低优先级的block状态时,比如object.wait(),object.sleep(),object.join()。它会立马触发一个unblock解除阻塞,并throw一个InterruptedException。
    • 其他情况,Thread.interrupt()仅仅只是更新了status标志位。然后你的工作线程通过Thread.isInterrrupted()进行检查,可以做相应的处理,比如也throw InterruptedException或者是清理状态,取消task等。

    解答一下之前的几个问题:

    问题1: Thread.interrupt()方法和InterruptedException异常的关系?是由interrupt触发产生了InterruptedException异常? 

    答: Thread.interrupt()只是在Object.wait() .Object.join(), Object.sleep()几个方法会主动抛出InterruptedException异常。而在其他的的block常见,只是通过设置了Thread的一个标志位信息,需要程序自我进行处理。

     

    问题2:Thread.interrupt()会中断线程什么状态的工作? RUNNING or BLOCKING?

    答:Thread.interrupt设计的目的主要是用于处理线程处于block状态,比如wait(),sleep()状态就是个例子。但可以在程序设计时为支持task cancel,同样可以支持RUNNING状态。比如Object.join()和一些支持interrupt的一些nio channel设计。

    问题3: 一般Thread编程需要关注interrupt中断不?一般怎么处理?可以用来做什么?

    答: interrupt用途: unBlock操作,支持任务cancel, 数据清理等。

    问题4: LockSupport.park()和unpark(),与object.wait()和notify()的区别?

    1.  面向的主体不一样。LockSuport主要是针对Thread进进行阻塞处理,可以指定阻塞队列的目标对象,每次可以指定具体的线程唤醒。Object.wait()是以对象为纬度,阻塞当前的线程和唤醒单个(随机)或者所有线程。

    2.  实现机制不同。虽然LockSuport可以指定monitor的object对象,但和object.wait(),两者的阻塞队列并不交叉。可以看下测试例子。object.notifyAll()不能唤醒LockSupport的阻塞Thread.

    问题5: LockSupport.park(Object blocker)传递的blocker对象做什么用?

    答: 对应的blcoker会记录在Thread的一个parkBlocker属性中,通过jstack命令可以非常方便的监控具体的阻塞对象.

     

    问题6: LockSupport能响应Thread.interrupt()事件不?会抛出InterruptedException异常?

    答:能响应interrupt事件,但不会抛出InterruptedException异常。

    原文链接请参见:https://yq.aliyun.com/articles/14680?spm=5176.100239.yqblog1.108.1I0Dhi 

  • 相关阅读:
    SpringMVC(二)
    SpringMVC(一)
    Mybatis之mapper.xml配置文件中的#{}和${}
    Mybatis(二)
    Mybatis(一)
    Linux部署项目
    BOS物流项目第十三天
    Failed to read schema document 'http://www.springframework.org/schema/beans/spring-beans.xsd'
    景点API支持查询携程旅游门票景点详情
    Html引入百度富文本编辑器ueditor及自定义工具栏
  • 原文地址:https://www.cnblogs.com/moonandstar08/p/5384892.html
Copyright © 2011-2022 走看看