一個去京東面試的工作了5年的粉絲來找我說:
Mic老師,你說併發程式設計很重要,果然我今天又掛在一道併發程式設計的面試題上了。
我問他問題是什麼,他說:”如何中斷一個正在執行中的執行緒?“。
我說這個問題很多工作2年的人都知道~
好吧,對於這個問題,來看看普通人和高手的回答。
普通人:
嗯。。。。。。。。。。。
高手:
關於這個問題,我從幾個方面來回答。
首先,執行緒是系統級別的概念,在Java裡面實現的執行緒,最終的執行和排程都是由作業系統來決定的,JVM只是對作業系統層面的執行緒做了一層包裝而已。
所以我們在Java裡面通過start方法啟動一個執行緒的時候,只是告訴作業系統這個執行緒可以被執行,但是最終交給CPU來執行是作業系統的排程演算法來決定的。
因此,理論上來說,要在Java層面去中斷一個正在執行的執行緒,只能像類似於Linux裡面的kill命令結束程式的方式一樣,強制終止。
所以,Java Thread裡面提供了一個stop方法可以強行終止,但是這種方式是不安全的,因為有可能執行緒的任務還沒有,導致出現執行結果不正確的問題。
要想安全的中斷一個正在執行的執行緒,只能線上程內部埋下一個鉤子,外部程式通過這個鉤子來觸發執行緒的中斷命令。
因此,在Java Thread裡面提供了一個interrupt()方法,這個方法配合isInterrupted()方法使用,就可以實現安全的中斷機制。
這種實現方法並不是強制中斷,而是告訴正在執行的執行緒,你可以停止了,不過是否要中斷,取決於正在執行的執行緒,所以它能夠保證執行緒執行結果的安全性。
以上就是我對這個問題的理解!
總結
這個問題,很多工作了5年以上的小夥伴都不一定清楚。
我想說的是,一味的專注在CRUD這種自動化的重複性工作中除了前面3年時間會有很多的成長以外,後續的時間基本上就是在做重複的勞動。
和別人拉開差距恰恰是工作之外的8個小時。
如果覺得作品不錯,記得點贊和關注。
版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自Mic帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!