【汇总篇】终止线程的4种方式

终止线程常用的有4种方式。你了解吗?

基础篇—线程的生命周期

线程生命周期.png
  • 新建:就是刚使用new方法,new出来的线程;

  • 就绪:就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行;

  • 运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能;

  • 阻塞:在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如sleep()wait()之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,比如调用notify()或者notifyAll()方法。唤醒的线程不会立刻执行run方法,它们要再次等待CPU分配资源进入运行状态;

  • 销毁:如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源;

1. 终止线程的4种方式

1.1 线程运行结束

程序运行结束,线程自动结束;

1.2 使用自定义标志退出线程

定义一个volatile修饰的关键字,当关键字为true时,while循环退出。

1.3 使用Interrupt方法结束线程

使用interrupt方法来中断线程:

  1. 线程处于阻塞状态:例如使用了sleep,同步锁wait,sleep方法,socket的receiver[rɪˈsiːvə(r)]、accept等方法时,会使得线程处于阻塞状态。当调用线程的interrupt方法时,会抛出InterruptException异常。通过代码捕获异常,然后通过break跳出循环状态。从而让我们有机会结束这个线程的执行;

  2. 线程未处于阻塞状态:需要使用interrupted()判断线程的中断标识来退出循环。当使用interrupt()方法时,中断标志会置位true,此时使用自定义标志来控制循环是一样的道理。

注意:当调用interrupt()方法后,第一次调用interrupted()方法会返回true,再次调用interrupted()时,会返回false。

interrupted()方法注释.png

1.4 stop方法终止线程(不推荐-线程不安全)

程序中可以使用thread.stop()来强行终止线程,但是stop方法很危险,就像突然关闭计算机电源,而不是按正常程序关机,会产生不可预料的后果。

不安全的主要是:thread.stop()调用之后,创建子线程的线程会抛出ThreadDeatherror的错误,并且会释放子线程所持有的所有锁。

而一般加锁的代码块,都是为了保护数据的一致性,如果在调用thread.stop()后导致该线程所持有的所有锁突然释放(不可控制),可能会导致被保护的数据呈现不一致的情况。

2. FutureTask的cancel取消任务

FutureTask的cancel方法真的能终止正在运行的线程吗?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容