Fork me on GitHub

线程的终止

1.Thread的终止

首先,不建议使用Thread类的stop方法,因为会强制释放线程使用的资源,例如锁、文件等,会出现令人意想不到的问题。Java中Thread类提供了interupt方法来设置线程的中断标志位使线程停止,但是interrupt方法并不是万能的,只能在有限的情况下中断线程:

  1. 线程处于等待、条件等待时。例如在线程中调用了lock.wait()、Thread.sleep()等方法
  2. nio中会能够检测中断标志位的方法
  3. 在线程中不断检测了中断标志位。例如在while循环中调用isInterrupted方法检测是否设置了中断标志位,如果设置了中断标志位,则退出线程

但是像大多数情况,例如线程在读写文件等IO耗时的工作是不会处理中断标志的,也不会中断线程。在这种情况下,线程如果被中断了,占用的资源还未释放,会出现新的问题。所以线程中断需要谨慎

 

2.线程池中的线程终止

executorService的submit方法的返回值是future对象,通过future对象的cancel方法(参数是ture)可以中断线程。如果线程正在执行,并且可以中断,则会中断。如果线程在队列中,则会剔除队列不再执行

posted @ 2020-02-07 23:02  gitmoji  阅读(204)  评论(0编辑  收藏  举报