在线程中,wait()、join()、sleep()三个方法都是进行阻塞的方法。对应可以使用interrupt()方法进行打断,被打断后线程会抛出打断异常,但是不会修改IsInterrupt,也就是此时去调用IsInterrupted()方法后获得的实际上是false。
而当线程处于非阻塞状态时,使用interrupted()方法对线程进行打断,此时不会出现打断异常,但是会将IsInterrupt设置为true。
这里需要引入两阶段终止模式
其实际就是一种正确的线程终止模式,如果我们现在有一个线程需要去终止,如果我们直接调用stop()指令,考虑线程带锁的情况,线程获取了锁并且还未释放锁,此时被stop,显然线程无法释放锁,其他线程就无法获取锁。显然这不是合理的。
为了解决这个问题,我们可以使用interrupt来实现线程终止,如果线程此时处于wait()、join()、sleep(),我们需要捕获打断异常,并且手动将IsInterrupt置为true,而当线程在做其他事的时候,打断操作会自行将IsInterrupt置为true。
也就是说,只要执行了打断操作,都会获得IsInterrupt为true,此时我们只需要添加一个固定的条件判断,当IsInterrupt为true时,就进行后续处理,比如释放锁,释放其他资源等等,最终进行退出。
比如上述图中的一个监控线程,全程在进行监控,现在想要终止线程,具体流程图如图。