线程停止的原则:使用interrupt来通知,而不是强制停止线程
interrupt在英文中实为通知的意思,那么为什么停止线程不直接停止而使用通知呢?
这是因为在java中,我们如果想要停止一个线程,能做的最多就是告诉线程需要被中断了,而线程本身决定何时停止或者停不停止。
大多数情况我们是可以让系统中的线程运行直到结束的,或者让他们自动停止。然而其实有时候,作为开发者或者用户是希望提前结束线程的。
但是要让任务安全并且迅速停止下来并不是一件容易的事,java并没有提供任何机制来安全的停止线程,只提供了中断(interruption),这其实是一种协作机制,让一个线程去通知另外一个线程停止当前的工作。
我们很少希望某个线程的服务立即停止而不进行任何收尾工作留下一堆烂摊子,因为这样会使线程间共享的数据的状态展现出不一致的状态,那么当我们使用协作的方法去停止线程,线程会先完成手头上的工作并清除掉未开始的工作,然后再结束,这样可以保证共享资源状态的一致性,更加的安全。
实践:如何正确停止线程
线程什么情况下会停止呢?
1.run中所有方法执行完毕了 2.有异常出现且系统没有捕获
如何使用interrupt来停止线程?
通常情况下停止:
public
不使用thread.interrupt();语句中断线程时的结果:
使用thread.interrupt();语句中断线程时的结果:
线程可能被阻塞:
public
执行结果:
当我们thread.interrupt();生效时,恰逢Thread.sleep(1000);生效期内,那么为什么会抛出这个异常呢?因为我们这里的catch (InterruptedException e) 的存在,线程会响应这个中断,响应中断的方式是打印出这个异常,可以从异常信息中看出:sl