彻底搞懂JAVA并发--如何正确的关闭线程?

 

~~只有系统的学习,解决问题才可以毫不费力~~

关注我,一起系统学习!

  1. 能否停止运行中的线程?

运行中线程能否强制杀死?答案是不能,JAVA中线程类有stop()、destroy()类似的方法可以停止线程,但是不建议使用,因为如果强制杀死线程会导致线程任务中的无法正常释放,比如文件流不能正常关闭,网络连接不能正常断开等。

因此,当线程运行中不要强制打断它,合理的关闭方法是等线程任务执行结束,系统自动释放资源,然后结束。如果是循环执行的线程,需要用到线程通信通知线程停止。

  1. 守护线程

下面这段代码,当main方法执行结束后,线程会不会自动退出?JVM会不会退出?

 

答案是不会。

因为这里的线程是一个无限循环的线程,在JAVA中线程创建默认是非守护线程,只有当所有的非守护线程都执行完毕后,无论有没有守护线程,JVM才会退出。

那么什么是守护线程呢?

守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。

因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。

将线程设置为守护线程也很简单,只需要调用setDameon(true)方法即可,图例中中的t1设置成守护线程后,main方法执行结束后也就自动退出,整个JVM也会自动退出。

3.如何停止循环线程?

上面创建的线程是一个死循环,无法手动停止,一般需要添加标志位来控制线程的停止,类似这样:

 

但是也有一种case,当线程在while循环中某处阻塞了,比如调用了Object.wait方法,那么就没有办法再次退出了,因为无法再次循环。


【福利】

2021最新JAVA大厂面试题

 

公众号:玉祥笔记

免费获取!!!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值