【Java面試】如何中斷一個正在執行的執行緒?

跟著Mic學架構 發表於 2022-05-28
Java 面試

一個去京東面試的工作了5年的粉絲來找我說:

Mic老師,你說併發程式設計很重要,果然我今天又掛在一道併發程式設計的面試題上了。

我問他問題是什麼,他說:”如何中斷一個正在執行中的執行緒?“。

我說這個問題很多工作2年的人都知道~

好吧,對於這個問題,來看看普通人和高手的回答。

普通人:

嗯。。。。。。。。。。。

高手:

關於這個問題,我從幾個方面來回答。

首先,執行緒是系統級別的概念,在Java裡面實現的執行緒,最終的執行和排程都是由作業系統來決定的,JVM只是對作業系統層面的執行緒做了一層包裝而已。

所以我們在Java裡面通過start方法啟動一個執行緒的時候,只是告訴作業系統這個執行緒可以被執行,但是最終交給CPU來執行是作業系統的排程演算法來決定的。

image-20220423145615778

因此,理論上來說,要在Java層面去中斷一個正在執行的執行緒,只能像類似於Linux裡面的kill命令結束程式的方式一樣,強制終止。

所以,Java Thread裡面提供了一個stop方法可以強行終止,但是這種方式是不安全的,因為有可能執行緒的任務還沒有,導致出現執行結果不正確的問題。

要想安全的中斷一個正在執行的執行緒,只能線上程內部埋下一個鉤子,外部程式通過這個鉤子來觸發執行緒的中斷命令。

因此,在Java Thread裡面提供了一個interrupt()方法,這個方法配合isInterrupted()方法使用,就可以實現安全的中斷機制。

這種實現方法並不是強制中斷,而是告訴正在執行的執行緒,你可以停止了,不過是否要中斷,取決於正在執行的執行緒,所以它能夠保證執行緒執行結果的安全性。

以上就是我對這個問題的理解!

carbon-202204230315001

總結

這個問題,很多工作了5年以上的小夥伴都不一定清楚。

我想說的是,一味的專注在CRUD這種自動化的重複性工作中除了前面3年時間會有很多的成長以外,後續的時間基本上就是在做重複的勞動。

和別人拉開差距恰恰是工作之外的8個小時。

如果覺得作品不錯,記得點贊和關注。

file

版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Mic帶你學架構
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注「跟著Mic學架構」公眾號公眾號獲取更多技術乾貨!

【Java面試】如何中斷一個正在執行的執行緒?