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 

  • 相关阅读:
    nullnullConnecting with WiFi Direct 与WiFi直接连接
    nullnullUsing WiFi Direct for Service Discovery 直接使用WiFi服务发现
    nullnullSetting Up the Loader 设置装载机
    nullnullDefining and Launching the Query 定义和启动查询
    nullnullHandling the Results 处理结果
    装置输出喷泉装置(贪心问题)
    数据状态什么是事务?
    停止方法iOS CGD 任务开始与结束
    盘文件云存储——金山快盘
    函数标识符解决jQuery与其他库冲突的方法
  • 原文地址:https://www.cnblogs.com/moonandstar08/p/5384892.html
Copyright © 2011-2022 走看看