Java中有常见的停止线程的方式:
使用interrupt()方法中断线程
我们可以使用thread.interrupt()方法来中断正在运行的线程。interrupt()方法只能在线程中打上一个中断标记,并不会真正的停止线程。要想停止一个正在运行中的线程需要进行特殊的处理。
使用interrupt()方法后会在线程上打上一个停止的标记,在线程中调用isInterrupt()方法来判断当前线程是否被中断。判断后可以进行线程的正常停止(运行完成或者抛出异常亦或者直接return)。
停止线程的示例:
以上需要注意的点:
- interrupt()方法不会真正停止线程 ,上述代码中真正停止线程是抛出的InterruptedException;
- 上述代码中使用了抛出异常来停止线程,可以在其中添加正常的逻辑使用return来停止线程;
- 如果线程在sleep,调用interrupt会直接抛出InterruptedException异常。
使用退出标记来停止线程
可以使用一个停止标记,在线程中进行判断该标记的状态然后进行处理。
以上需要注意的点:
- 变量使用volatile关键字修饰 ,volatile关键字使得线程每次强制去公共堆栈中取的变量的值,而不是从线程的私有数据栈中获取值;
- 变量isStop如果完全暴露在外,可能会造成不安全。可以使用private来修饰;
使用stop()方法停止线程
stop()方法会立刻停止线程,但是不建议使用该方法停止线程。stop()方法已将作废并且在将来的java版本中,这个方法将不可用或不被支持。
使用stop()方法强行停止线程可能产生不可预料的结果,在实际开发中基本不会这样停止线程。
如果您在上述文章中发现有错误的地方欢迎您指出来我会积极去改正。