感谢老师的前面的解惑让我弄清楚了interrupt不是实时被检测而是当遇到阻塞时会触发这个检测(我个人理解为被动检测),“interrupt是一个信号,这个信号并不是实时检测的,也不是每行代码都能检测的,在本例中,只有程序运行到sleep时,才能检测到线程被中断了,然后会抛出异常;而代码在计算其他内容时,比如执行if (num % 100 == 0)时,是无法感知到中断已经发生了的。所以问题不在于休眠时间的长短,而是在于“每次循环都有休眠,所以终究会运行到休眠的sleep代码,在sleep时才会抛出异常”。
但是我后面想主动去检测这个中断,第一种设想我是在父线程不断给子线程发送中断信号,就算第一次处于休眠期间并且清除了中断信号那么没关系,我后面的中断请求总有一个你可以在while(!Thread.currentThread().isInterrupted())接收到吧,然而当我运行代码的时候发现,当第一次抛出异常后程序就卡住了,难道父线程只能像启动线程那样也只能使用一次中断?我查看了下interrupt()源码,首先会检查路径,然后检查blocker是否为空,不为空设置中断标志,最后执行这个 blocker.interrupt(this)再结束方法(这行代码没太懂),如果为空仅设置中断标识然后结束方法。看了几遍发现还是没有头绪,代码如下:
运行结果,运行中抛出第一次中断错误后会卡在那儿,如箭头所示,并未结束。
第二种设想,既然上面不行,那我手动一次一次运行看有没有可能不抛出中断异常直接结束,然而我发现历史总是惊人的相似。
那么问题来了,当迭代中出现slee()时为什么在while(!Thread.currentThread().isInterrupted())检测不到中断,只能在sleep()时候检查到中断信号呀(而且已经把休眠时间设置得足够短了,测试次数也足够多了),还有父线程只能发送一次信号吗?麻烦老师给小菜鸡解释一下,老师时间宝贵,我也试着自己去寻找答案,实现想不通才求助于您,救救孩子吧。