BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #55122同步于 2017/2/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

应用服务器关闭线程池的问题

earthshaker
2017/2/16镜像同步8 回复
一个类在加载的时候就启动一个线程池,这个类使用在一个web应用中,比如一个war包,在重新发包而不重启tomcat或者weblogic的时候,没法把线程池停掉,导致有线程泄露。 因为这个类是通用的,不想依赖于spring,另外也不想让使用者感知线程池的存在,所以不想让使用者主动调用destroy方法,有什么方法能让线程池在停止应用(不是停止tomcat)时停掉呢?
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
nvyoujiaren机器人#1 · 2017/2/16
看你的名字就是个男的,所以我不回答~
june0334机器人#2 · 2017/2/16
listener
Lamperouge机器人#3 · 2017/2/16
继09论坛征友之后,撼地神牛来java版提问了 【 在 nvyoujiaren (北邮颜值前三,骗你是小狗) 的大作中提到: 】 : 看你的名字就是个男的,所以我不回答~
fenglin机器人#4 · 2017/2/16
利用applicationListener
nuanyangyang机器人#5 · 2017/2/18
你要保证你的线程本身能够被异步终止。 Java不会强行地停止一个线程的执行。停止线程池的时候,一般会对里面正在运行的线程进行interrupt。当一个线程被interrupt之后,并不会立即有反应,但如果用Thread.interrupted()方法检测,会返回true。一些标准库方法,比如Thread.sleep(),Lock.lockInterruptbly(),SocketChannel.read()等,在阻塞等待的时候如果被interrupt,会抛出异常。但是,如果一个线程在一个循环里执行(比如while循环或者for循环),没有Thread.interrupted()测试,也没有调用任何会对interrupt抛出异常的方法,那么这个线程就真的不会停下来了。 建议的做法是:首先,你的线程池里的作业要为多线程设计。方法里,每做一些事情,就要调用Thread.interrupted()看自己是否被中断了,不要怕麻烦。如果被中断了,就主动抛出InterruptedException异常,并用finally块来做清理操作。如果有循环,那么在循环的开头或者末尾要检测Thread.interrupted()。对于可能因为interrupt而抛出异常的标准库方法,记得处理异常,但不要把异常藏起来。interrupt的意思就是希望线程停下来,千万不要把异常抓住之后安静地扔掉继续执行! 参考这个帖子: https://bbs.byr.cn/#!article/Java/41451
earthshaker机器人#6 · 2017/2/21
明白了,其实tomcat在停掉一个war包时应该会对里面的线程池调用interrupt,但是线程里一半try-catch了,所以线程池关不掉,造成线程泄露。 【 在 nuanyangyang 的大作中提到: 】 : 你要保证你的线程本身能够被异步终止。 : Java不会强行地停止一个线程的执行。停止线程池的时候,一般会对里面正在运行的线程进行interrupt。当一个线程被interrupt之后,并不会立即有反应,但如果用Thread.interrupted()方法检测,会返回true。一些标准库方法,比如Thread.sleep(),Lock.lockInterruptbly(),SocketChannel.read()等,在阻塞等待的时候如果被interrupt,会抛出异常。但是,如果一个线程在一个循环里执行(比如while循环或者for循环),没有Thread.interrupted()测试,也没有调用任何会对interrupt抛出异常的方法,那么这个线程就真的不会停下来了。 : 建议的做法是:首先,你的线程池里的作业要为多线程设计。方法里,每做一些事情,就要调用Thread.interrupted()看自己是否被中断了,不要怕麻烦。如果被中断了,就主动抛出InterruptedException异常,并用finally块来做清理操作。如果有循环,那么在循环的开头或者末尾要检测Thread.interrupted()。对于可能因为interrupt而抛出异常的标准库方法,记得处理异常,但不要把异常藏起来。interrupt的意思就是希望线程停下来,千万不要把异常抓住之后安静地扔掉继续执行! : ...................
earthshaker机器人#7 · 2017/2/21
应用服务器停war包的时候,类卸载,停线程之类的,暖神能不能开个帖子讲一下。因为我们的应用发几次就得重启weblogic,不然cpu和堆都涨。 【 在 nuanyangyang 的大作中提到: 】 : 你要保证你的线程本身能够被异步终止。 : Java不会强行地停止一个线程的执行。停止线程池的时候,一般会对里面正在运行的线程进行interrupt。当一个线程被interrupt之后,并不会立即有反应,但如果用Thread.interrupted()方法检测,会返回true。一些标准库方法,比如Thread.sleep(),Lock.lockInterruptbly(),SocketChannel.read()等,在阻塞等待的时候如果被interrupt,会抛出异常。但是,如果一个线程在一个循环里执行(比如while循环或者for循环),没有Thread.interrupted()测试,也没有调用任何会对interrupt抛出异常的方法,那么这个线程就真的不会停下来了。 : 建议的做法是:首先,你的线程池里的作业要为多线程设计。方法里,每做一些事情,就要调用Thread.interrupted()看自己是否被中断了,不要怕麻烦。如果被中断了,就主动抛出InterruptedException异常,并用finally块来做清理操作。如果有循环,那么在循环的开头或者末尾要检测Thread.interrupted()。对于可能因为interrupt而抛出异常的标准库方法,记得处理异常,但不要把异常藏起来。interrupt的意思就是希望线程停下来,千万不要把异常抓住之后安静地扔掉继续执行! : ...................
earthshaker机器人#8 · 2017/2/21
jar包不想与spring关联,也不想让使用者自己写destroy方法 【 在 fenglin 的大作中提到: 】 : 利用applicationListener