内存泄漏事故(三)线程的interrupted flag 的坑【重要】
背景:
子线程中,分线程处理然后聚拢
future。get
但是在futureget的异常处理中,并未抛出异常,只是调用Thread.currentThread().interrupt(),
因此主线程要监控这个interrup旗标,从而决定是否抛出异常
1 起先

发现没什么用
2 旗标的生命周期

子线程跑完后会复位flag,当然这个复位的时间与future返回的先后绝对顺序是不稳定的,11和1.8也不一样,这才导致1秒左右内出现了true
但这个行为是不可信任的
3 修改

4 测试
成功
5 周边
https://blog.csdn.net/u012496112/article/details/113802833
但是代码中发现 ,打断一个sleep线程后调用isInterrupted查看打断标记,有时为false有时为true,而且为true的情况反而更多,
如果要得到稳定的false,即重置打断标记后的结果,应该在t1.interrupt()后, sleep一会,给点时间,有点像jvm启动后偏向锁延迟设置的意思。
另外加点思考,从第一个返回true的日志顺序看到,异常已经抛出,再查看打断标记还是true,而按源码描述的是先清除打断标记再抛异常,有点矛盾,这里好多方法都是native,也没法再往下看,以后遇到再说吧,mark
浙公网安备 33010602011771号