有可能以非編程方式殺死處於狀態RUNNING
的線程?如何殺死處於狀態RUNNING的Java線程?
我知道top
命令在*nix
可以顯示線程。我可以殺死操作系統中的線程嗎?
我想知道是否有辦法將線程鏈接到進程,所以我只能殺死那個特定的線程而不是應用程序。
我們的代碼中存在一個錯誤,它使一個線程保持在同步方法中的狀態RUNNING
。該線程保持lock
對象「懸掛」應用程序。
錯誤已修復。但我想知道是否可能。
有可能以非編程方式殺死處於狀態RUNNING
的線程?如何殺死處於狀態RUNNING的Java線程?
我知道top
命令在*nix
可以顯示線程。我可以殺死操作系統中的線程嗎?
我想知道是否有辦法將線程鏈接到進程,所以我只能殺死那個特定的線程而不是應用程序。
我們的代碼中存在一個錯誤,它使一個線程保持在同步方法中的狀態RUNNING
。該線程保持lock
對象「懸掛」應用程序。
錯誤已修復。但我想知道是否可能。
簡短的回答是「也許,但你不應該和大多數時候也不會工作」。
長的答案是:
「也許......」 一些JVM實現地圖的java線程操作系統線程和一些不。如果JVM執行到本地操作系統線程的映射,那麼您可以使用操作系統提供的一些進程工具(例如* nix上的kill
)來終止該線程。如果JVM執行綠色線程,這意味着它不會將Java線程映射到操作系統級別的線程,那麼使用操作系統級別的工具基本上是不成功的。幸運的是,只有極少數JVM實現可以實現這一點。無論JVM如何組織它的線程,都可以使用一種方法,即使用java調試器。本文介紹了執行此操作的過程:http://www.rhcedan.com/2010/06/22/killing-a-java-thread/。
「但你不應該做」 在操作系統級別殺死一個線程幾乎肯定會離開JVM不確定狀態(讀「JVM可能在磁盤上崩潰或刪除所有文件或做任何事情fricking請做「)。即使採用調試器方式,只有非常少量的Java應用程序(閱讀「沒有在這個星球上製作的應用程序」)才能正確處理外部應用程序正在殺死其中一個線程的事件。因此,這些應用程序將處於未定義狀態(請閱讀「應用程序可能會崩潰或刪除磁盤上的所有文件或做任何令人費解的操作」)。
「和大部分的時間也不會工作,要麼」 如果線程真的堅持了一些堵塞IO等,然後殺死該線程將無法正常工作,它只是不響應。如果一個程序卡住了,最好殺死整個程序,找到程序的問題並修復它而不是殺死一個單獨的線程。
我知道這不是方式。只是想知道。感謝您的回答。 – ssedano
有關殺死一個線程所有的疑慮,請參閱本: http://download.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html
海報要求採取「非程序化」的方式。 –
鏈接已死 – Scheintod
Thread.interrupt
方法來請求關機線程..
或者如果u使用一個線程池,然後將executorService.shutdown() and executorService.shutdownNow() should be used to shutdown the thread
OP要求採用非程序化方法。 –
在Linux ,有一個tkill(int tid, int sig)
命令,類似於kill
。
在窗戶上,ProcessExplorer
可以從gui中完成,不知道是否有任何cli。
如果你有一個pid,你可以殺死它! – hovanessyan
僅在* nix上尋找解決方案? –
Windows上的ProcessExplorer可以殺死單獨的線程,所以是的,這是可能的。可能也在unix上。 –