libreportparam2.dll无法继续执行代码_Java并发系列番外(1)——让Thread#stop方法无法终止你的线程...
眾所周知,Thread 類有一個 stop 方法,可以用來終止線程。當然,這個方法連同 suspend,resume 方法一起都已經被棄用了。原因是 stop 方法終止線程過于暴力,不管被 stop 的線程在干什么,一旦被 stop 它就得立刻停止執行,然后釋放鎖,這是非常不安全的。
那么,有沒有辦法,讓被 stop 的線程繼續執行,并且不釋放鎖呢?
我寫了一段代碼,各位可以拿去試試:
package主要邏輯:
- 先開一個線程 canNotStopThread ,它的工作很簡單,加鎖,然后累加 1~100;
- 再開一個線程 thread ,它一直在等 canNotStopThread 釋放鎖;
- 最后,在主線程,循環調用 stop 方法 100 次,試圖終止 canNotStopThread 執行,讓thread 獲得鎖。
這段代碼不管跑多少次,都會看到如下結果:
... rollback rollback rollback rollback i = 1 i = 2 ... i = 98 i = 99 i = 100 sum = 5050 acquired lockProcess finished with exit code 0反應了幾點:
- 主線程 stop 了 100 次,但是沒有起作用;
- canNotStopThread 線程還是正確地累加了 1~100;
- canNotStopThread 線程累加完畢之前,thread 線程休想得到鎖,stop 也沒用。
stop 方法是否能讓線程終止,并且釋放鎖?
當然能,不用懷疑。
我的這段代碼,如果把 while 循環去掉,結果就會變成這樣:
rollback i = 1 i = 2 i = 3 i = 4 i = 5 i = 6 i = 7 i = 8 i = 9 acquired lockProcess finished with exit code 0沒有執行完,線程被終止,然后鎖丟了。
讓 stop 方法不能終止線程的關鍵是什么?
是那個 while 循環嗎?不完全是。
關鍵點有三個:
- catch ThreadDeath(這是個 Error),并且別拋出去,直接吃掉;
- catch 塊一行代碼都不要有,如果有 finally 塊,也是一行代碼都不要有,只要有代碼就必須 catch ThreadDeath 吃掉;
- 來一個循環,業務流程不執行完,不要讓它停下來。
為什么要吃掉 ThreadDeath?
如果你的線程被 stop 了,不管你的線程執行到了什么地方,都會立刻拋出一個 ThreadDeath。線程的 run 方法拋了 Error,線程自然就結束了,鎖自然也釋放了。
所以 ThreadDeath 必須要吃掉,不能讓它拋出去,拋出去線程就結束了。
為什么 catch 塊和 finally 塊不能有代碼?
試試把 run 方法改成這樣:
@Override或者這樣:
@Override這樣線程就會被 stop 掉。
如果一定要在 catch 或者 finally 塊里面加一些代碼,比如打個日志什么的,就必須再套一層 catch:
@Override因為你無法知道,當你的線程被 stop 的時候,它跑到哪了。如果正跑著 try 塊的代碼,那就沒問題;如果在跑 catch 或者 finally 塊代碼的時候被 stop,就完蛋了。
所以,每一行代碼都必須被 try 包起來,catch ThreadDeath 吃掉。因為每一行代碼,準確地說,每一條指令都有拋 Error 的風險。
以上,知道了 stop 方法是如何終止線程的,就有辦法讓它終止不掉你的線程。
當然,這個只能說是一點有意思的奇技淫巧,沒什么用啊,不建議這么搞。
首發于 CSDN 博客:
讓Thread#stop方法無法終止你的線程_JinchaoLv的博客-CSDN博客_java thread.stop無法停止?blog.csdn.net總結
以上是生活随笔為你收集整理的libreportparam2.dll无法继续执行代码_Java并发系列番外(1)——让Thread#stop方法无法终止你的线程...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: button按钮onclick触发不了_
- 下一篇: python注释以符号什么开始_pyth