线程的interrupt方法很特殊,有必要在这里着重说明一下。
interrupted方法是查询是否有“中断状态”这一标志,而这一标志很重要很重要。
通常情况下这个标志都是没有被设置的,一旦这个标志被设置了,则所有当前正在阻塞的方法(限定在由于wait、sleep、join三种方法引发的阻塞)都会立刻完成“跳出阻塞状态、抛出InterruptedException异常、清除中断状态标志”这三件工作。仿佛线程在阻塞时,总在不断的查询这一标志,一旦发现这个标志被设置了,那么就立刻发生上述提到的三件工作。不过这只是一种猜测,至于底层到底是如何实现的,我们并不知道。
而我们调用interrupt方法也很有趣,通常这个标志都是未被设置的,一旦调用这个方法,它就会设置这个标志,说白了,这个方法所完成的工作也就仅仅限于设置了一个这样的标志。接下来就能和上一段落中提到的事情相关联了,如果线程当前是阻塞的状态,那么它会利用这个标志啦,然后做“三件事情”,然后这个标志又被清除了;如果线程当前是非阻塞状态,那么该方法的调用也就仅仅是设置一个标志而已,注意设置了这个标记就和没设置这个标记完全不同了,一旦你再想调用sleep等阻塞方法时,它们都会“立刻跳出阻塞状态、抛出异常、清除标记”啦,呵呵。
至此,终于清除了interrupt方法的作用了吧?