一、stop()与destroy()函数

线程是“一段运行中的代码”,或者说是一个运行中的函数。既然是在运行中,就存在一个最基本的问题: 运行到一半的线程能否强制杀死?

答案肯定是不能。在Java中,有stop()、destory()之类的函数,但这些函数都是官方明确不建议使用的。原因很简单,如果强制杀死线程,则线程中所使用的资源,例如文件描述符、网络连接等不 能正常关闭。 

一个线程一旦运行起来,就不要去强行打断它,合理的关闭办法是让其运行完(也就是函数执行完毕)干净地释放掉所有资源,然后退出。如果是一个不断循环运行的线程,就需要用到线程间的通信机制,让主线程通知其退出。

二、守护线程

在main(..)函数中开了一个线程,不断循环打印。请问:main(..)函数退出之后,该线程是否会被强制退出? 整个进程是否会强制退出?

java 关闭进程 java进程优雅关闭_JVM

java 关闭进程 java进程优雅关闭_JDK源码_02

答案是不会的。在C语言中,main(..)函数退出后,整个程序也就退出了,但在Java中并非如此

当在一个JVM进程里面开多个线程时,这些线程被分成两类:守护线程非守护线程默认开的都是非守护线程。在Java中有一个规定:当所有的守护线程退出后,整个JVM进程就会退出。意思就是守护线程“不算作数”,守护线程不影响整个 JVM 进程的退出。例如, 垃圾回收线程就是守护线程,它们在后台默默工作,当开发者的所有前台线程(非守护线程)都退出之后,整个JVM进程就退出了。

三、设置关闭的标志位

实际工作中,开发人员通常通过一个标志位来实现线程关闭

java 关闭进程 java进程优雅关闭_守护线程_03

上面的代码有一个问题:如果MyThread t在while循环中阻塞在某个地方,例如里面调用了 object.wait()函数,那它可能永远没有机会再执行 while(!stopped)代码,也就一直无法退出循环。