Java多線程沒什麼難的:如何優雅的停止線程

Java多線程沒什麼難的:如何優雅的停止線程

前言

本篇文章是一個系列文章,旨在簡單、快速的重拾多線程的基礎用法,深入淺出的捋清楚多線程的邊邊角角。

今天聊得話題是:如何優雅的暫停線程~

系列其他文章可以在歷史文章中查閱~

文章內容,來自博客園:像風一樣。感興趣的小夥伴可以移步自行關注。

一、停止線程

停止線程是在多線程開發時很重要的技術點。停止線程並不像break語句那樣乾脆,需要一些技巧性的處理。

在Java中有以下3種方法可以終止正在運行的線程:

  • 1)使用退出標誌,使線程正常退出,也就是當run()方法完成後線程停止。
  • 2)使用stop()方法強行終止線程,但是不推薦使用這個方法,因為該方法已經作廢過期,使用後可能產生不可預料的結果。
  • 3)使用interrupt()方法中斷線程。

1.1、暴力法停止線程

調用stop()方法時會拋出 java.lang.ThreadDeath 異常,但在通常的情況下,此異常不需要顯示地捕捉。

Java多線程沒什麼難的:如何優雅的停止線程

方法stop()已經被作廢,因為如果強制讓線程停止線程則有可能使一些清理性的工作得不到完成。另外一個情況就是對鎖定的對象進行了“解鎖”,導致數據得不到同步的處理,出現數據不一致的情況。示例如下:

Java多線程沒什麼難的:如何優雅的停止線程

Java多線程沒什麼難的:如何優雅的停止線程

運行結果:

bb AA

1.2、異常法停止線程

使用interrupt()方法並不會真正的停止線程,調用interrupt()方法僅僅是在當前線程中打了一個停止的標記,並不是真的停止線程。

那我們如何判斷該線程是否被打上了停止標記,Thread類提供了兩種方法。

interrupted() 測試當前線程是否已經中斷。

isInterrupted() 測試線程是否已經中斷。

interrupted() 方法 不止可以判斷當前線程是否已經中斷,而且可以會清除該線程的中斷狀態。而對於isInterrupted() 方法,只會判斷當前線程是否已經中斷,不會清除線程的中斷狀態。

僅靠上面的兩個方法可以通過while(!this.isInterrupted()){}對代碼進行控制,但如果循環外還有其它語句,程序還是會繼續運行的。這時可以拋出異常從而使線程徹底停止。示例如下:

Java多線程沒什麼難的:如何優雅的停止線程

打印結果:

2490

2491

2492

2493

已經是停止狀態了!

注意

如果線程在sleep()狀態下被停止,也就是線程對象的run()方法含有sleep()方法,在此期間又執行了thread.interrupt() 方法,則會拋出java.lang.InterruptedException: sleep interrupted異常,提示休眠被中斷。

1.3、return法停止線程

return法很簡單,只需要把異常法中的拋出異常更改為return即可。代碼如下:

Java多線程沒什麼難的:如何優雅的停止線程

不過還是建議使用“拋異常”來實現線程的停止,因為在catch塊中可以對異常的信息進行相關的處理,而且使用異常能更好、更方便的控制程序的運行流程,不至於代碼中出現多個return,造成汙染。

尾聲

因為篇幅原因,這篇文章暫時到此就停止了。下篇文章《Java多線程沒什麼難的:深入前的淺出》


分享到:


相關文章: