全局资源的回收
【情景】
进程A启动3个业务线程去加载ApplicationContext变量,启动Spring容器,ApplicationContext类的加载使用了单例模式的写法。也就是ApplicationContext变量的加载就由启动最快的线程去加载,剩下的两个线程就使用这个加载过的ApplicationContext变量就好了。
假如此时ApplicationContext变量已经被线程A(最快的线程)成功初始化了(Spring容器已经启动了),如果此时线程A突然被Thread.stop()停掉了,那这个ApplicationContext实例对象是否还存在(Spring容器是否还在跑)呢?
【解答】
ApplicationContext变量也不会被回收,因为ApplicationContext变量是静态的,是属于整个系统的。所以即使线程A没了,但是由它Spring容器还是在跑的。
局部资源的回收
【情景】
进程A启动3个业务线程去调用A()方法,A()方法里面有一个局部变量ExecutorService线程池,操作就是启动它,去执行某一个job。ExecutorService线程池是一个方法中的局部变量。
如果此时这3个线程都成功调用这个a()方法并已经成功初始化ExecutorService对象,但是还没有shutdown。如果此时线程A突然被Thread.stop()停掉了,那么线程A启用的ExecutorService线程池对象是否还存在呢?如果存在那么这个ExecutorService线程池对象有没有被shutdown()还是处于正在连接的状态?
【解答】
线程A被Thread.stop()停掉之后,其栈中的ExecutorService对象是已经不存在了,所以也不用关心有没有被shutdown了。而线程B和线程C的ExecutorService对象可能还在,也可能已经被shutdown了。
网友评论