日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

libreportparam2.dll无法继续执行代码_Java并发系列番外(1)——让Thread#stop方法无法终止你的线程...

發布時間:2025/3/20 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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方法无法终止你的线程...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。