欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java线程阻塞中断和LockSupport问题

程序员文章站 2022-03-06 22:40:52
...

在学习CountDownLatch的时候非常关心它是如何阻塞线程和唤醒线程的。最后就追踪到了LockSupport。这个类有着wait(),notify()类似的功能,不过更精准。
       LockSupport.park(Thread thread),//阻塞thread
       LockSupport.unpark(Thread thread) //唤醒thread
这两个方法是相对应的,其实这两个方法调用的是Unsafe中对应的方法,而Unsafe是没有开源的,是通过JNI实现的。notify和wait方法的时候也是调用JNI。

问题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: LockSupport.park()和unpark(),与object.wait()和notify()的区别?

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

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

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

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

相关标签: thread interrupt