~~只有系统的学习,解决问题才可以毫不费力~~
关注我,一起系统学习!
-
能否停止运行中的线程?
运行中线程能否强制杀死?答案是不能,JAVA中线程类有stop()、destroy()类似的方法可以停止线程,但是不建议使用,因为如果强制杀死线程会导致线程任务中的无法正常释放,比如文件流不能正常关闭,网络连接不能正常断开等。
因此,当线程运行中不要强制打断它,合理的关闭方法是等线程任务执行结束,系统自动释放资源,然后结束。如果是循环执行的线程,需要用到线程通信通知线程停止。
-
守护线程
下面这段代码,当main方法执行结束后,线程会不会自动退出?JVM会不会退出?
答案是不会。
因为这里的线程是一个无限循环的线程,在JAVA中线程创建默认是非守护线程,只有当所有的非守护线程都执行完毕后,无论有没有守护线程,JVM才会退出。
那么什么是守护线程呢?
守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。
因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。
将线程设置为守护线程也很简单,只需要调用setDameon(true)方法即可,图例中中的t1设置成守护线程后,main方法执行结束后也就自动退出,整个JVM也会自动退出。
3.如何停止循环线程?
上面创建的线程是一个死循环,无法手动停止,一般需要添加标志位来控制线程的停止,类似这样:
但是也有一种case,当线程在while循环中某处阻塞了,比如调用了Object.wait方法,那么就没有办法再次退出了,因为无法再次循环。
【福利】
2021最新JAVA大厂面试题
公众号:玉祥笔记
免费获取!!!