JAVA中断机制

https://blog.csdn.net/weixin_42092278/article/details/81989449

https://blog.csdn.net/axman/article/details/562249

中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序

关于线程的中断原理,java采用的是一种协商中断机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断。Java中断模型也是非常简单,每个线程对象里都有一个boolean类型的中断标识,代表着是否有中断请求。被中断线程在合适的时机,合适的位置检测到中断标识为true后,代表有中断请求到来,接着完成这个中断请求的处理,当然也可以不处理。

一个线程新建后,在调用该线程的start()方法之前,该线程的状态就是NEW;当线程的start()方法被调用之后,该线程已经准备被CPU调度,此时线程的状态就是RUNNABLE;如果一个对象的monitor lock被其他线程获取了,这个时候我们再通过synchronized关键字去获取改对象的monitor lock时,线程就会进入BLOCKED状态;通过调用Thread#join()方法或者Object#wait()方法(不设置超时时间,with no timeout)或者LockSupport#park()方法可以让一个线程从RUNNABLE状态转为WAITING状态;TIMED_WAITING指线程处于等待中,但是这个等待是有期限的(),通过调用Thread#sleep(),Object#wait(long timeout),Thread#join(long timeout),LockSupport#parkNanos(),LockSupport#partUnitl()都可使线程切换到TIMED_WAITING状态。最后一种状态TERMINATED是指线程正常退出或者异常退出后的状态。

JAVA中断机制_第1张图片

当线程处于等待状态或者有超时的等待状态时(TIMED_WAITING,WAITING)我们可以通过调用线程的interrupt()方法来中断线程的等待,此时线程会抛InterruptedException异常。但是当线程处于BLOCKED状态或者RUNNABLE(RUNNING)状态时,调用线程的interrupt()方法也只能将线程的状态位设置为true。停止线程的逻辑需要我们自己去实现。

1)interrupt()方法,这是Thread类的实例方法。对一个线程调用interrupt()方法表示请求中断这个线程。该方法是唯一能将中断状态设置为true的方法。

2)isInterrupted()方法,这是Thread类的实例方法。测试线程是否已经中断,也就是测试线程中断状态是否设置为true。

3)Thread.interrupted(),这是Thread类的静态方法。判断线程是否被中断并清除中断状态。换句话说,如果连续两次调用该方法,则第二次调用将返回 false(再次中断的情况除外)。

你可能感兴趣的:(并发)