java 如何优雅的停止线程

Java中有常见的停止线程的方式:

使用interrupt()方法中断线程

我们可以使用thread.interrupt()方法来中断正在运行的线程。interrupt()方法只能在线程中打上一个中断标记,并不会真正的停止线程。要想停止一个正在运行中的线程需要进行特殊的处理。

使用interrupt()方法后会在线程上打上一个停止的标记,在线程中调用isInterrupt()方法来判断当前线程是否被中断。判断后可以进行线程的正常停止(运行完成或者抛出异常亦或者直接return)。

停止线程的示例:

在这里插入图片描述
以上需要注意的点:

  1. interrupt()方法不会真正停止线程 ,上述代码中真正停止线程是抛出的InterruptedException;
  2. 上述代码中使用了抛出异常来停止线程,可以在其中添加正常的逻辑使用return来停止线程;
  3. 如果线程在sleep,调用interrupt会直接抛出InterruptedException异常。

使用退出标记来停止线程

可以使用一个停止标记,在线程中进行判断该标记的状态然后进行处理。

在这里插入图片描述
以上需要注意的点:

  1. 变量使用volatile关键字修饰 ,volatile关键字使得线程每次强制去公共堆栈中取的变量的值,而不是从线程的私有数据栈中获取值;
  2. 变量isStop如果完全暴露在外,可能会造成不安全。可以使用private来修饰;

使用stop()方法停止线程

stop()方法会立刻停止线程,但是不建议使用该方法停止线程。stop()方法已将作废并且在将来的java版本中,这个方法将不可用或不被支持。
使用stop()方法强行停止线程可能产生不可预料的结果,在实际开发中基本不会这样停止线程。

如果您在上述文章中发现有错误的地方欢迎您指出来我会积极去改正。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值