Android高級開發工程師面試系列-線程

題目一:如何停止一個線程?
答:根據源碼可知線程停止方法stop已經被廢棄,所以不能直接簡單的停止線程。

問題延伸1:stop方法爲什麼被廢棄
答:因爲存在線程安全問題,多線程爲了解決共享資源搶佔的問題,使用了鎖的概念,避免資源不同步,但是正是因爲此原因,stop方法卻會帶來更大的麻煩,它會丟棄所有的鎖,導致原子邏輯受損。假如一個線程正在執行:synchronized void { x = 3; y = 4;} 由於方法是同步的,多個線程訪問時總能保證x,y被同時賦值,而如果一個線程正在執行到x = 3;時,被調用了 stop()方法,即使在同步塊中,它也乾脆地stop了,這樣就產生了不完整的殘廢數據。而多線程編程中最最基礎的條件要保證數據的完整性,所以請忘記線程的stop方法,以後我們再也不要說“停止線程”了。而且如果對象處於一種不連貫狀態,那麼其他線程能在那種狀態下檢查和修改它們。結果 很難檢查出真正的問題所在。

問題延伸2:那麼如何停止一個線程?
1.通知目標線程自行結束,而不是強制停止
2.目標線程應當具備處理中斷的能力

第一種方法:中斷方式 interrupt
通過線程的interrupt方法去中斷一個線程,在線程的執行方法中調用isInterrupt方法判斷線程是否中止了,如果已經中止,則不執行方法中相應的邏輯處理。

第二種方法:Boolean標記位
定義一個volatile boolean isStop標記位,可以在外面給修改isStop的值,在線程的執行方法中判斷isStop狀態來判斷是否執行線程的方法,這裏需要注意的是定義的布爾值必須用volatile 來修飾,如果不加存在線程可見性問題,加了volatile 告訴java虛擬機isStop是個易變的參數,在外面一旦發生變化,在其它使用到此變量的地方立馬能看見。

兩種中斷方式的區別:
1.Boolean標記爲方式性能更好,因爲interrupt方法底層調用了jni
2.Boolean標記爲更加靈活,interrupt通過拋異常的方式來觸發,Boolean標記爲可通過拋異常也可以通過boolean值來判斷
3.如果要使用系統的方法sleep等,則使用interrupt方法來中斷線程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章