Android : 執行緒的結束,掛起和恢復(上)
在Android應用的開發過程中, 我們有時候需要通過建立一個新的執行緒去完成一些任務。例如,我們去進行搜尋動作,如果搜尋比較費時,我們就需要通過進度條來提示使用者搜尋的進展情況,避免使用者認為發生了當機。此時進度條的重新整理就需要另外一個執行緒去實現。
但是這裡有一個誤區 : 有些人在多執行緒開發的時候會錯誤的認為,如果我們從建立執行緒的Activity中退出(該Acitivity被銷燬),則在該Activity中建立的自定義執行緒也會被銷燬。其實這是大錯特錯了。
實踐證明,上述情況下,建立的執行緒並不會自動銷燬,而是仍然在後臺默默無聞地執行,直到自行結束。Android的這種設計是無可厚非的。從理論上來解釋,應用的最小執行單位是執行緒,最小資源單位是程式,一個程式可以包含多個執行緒,而多個執行緒共享同一個所屬程式的資源。因此,個人理解Android的應用其實就是一個程式,而裡面的每個UI, Activity就是從屬這個程式的執行緒,從一個Activity進入另外一個Activity本質就是將之前的執行緒掛起,然後建立後面的執行緒。退出也是同理。自定義執行緒也是遵循這個原則的。除非去控制某個執行緒結束,否則只有當該現程執行完畢或者所屬的程式被銷燬,該執行緒才會真正的結束。
綜上,當我們在自定義執行緒還沒有執行完畢的情況下,需要結束相關動作的時候,我們就要認為地去結束相關執行緒。例如,在搜尋過程中,我們不想去繼續搜尋,而退出了搜尋功能,此時我們就需要去結束自定義的搜尋執行緒。如果不這樣會可能造成嚴重錯誤。例如,我們反覆進入搜尋功能去搜尋,在搜尋未結束時退出,然後再進入。這種情況下,由於之前的自定義執行緒並未結束,而之後又會有多個新搜尋執行緒被建立執行,很容易導致臨界區衝突,從而導致裝置當機。
那麼我們如何控制這些自定義執行緒呢?以下筆者將給與詳細說明。
一. 執行緒的結束
其實,通過幫助文件,我們可以知道,Android的執行緒類本身就提供了一些公共方法去結束執行緒。
void destroy()
This method is deprecated. Not implemented.
synchronized final void stop(Throwable throwable)
This method is deprecated. because stopping a thread in this manner is unsafe and can leave your application and the VM in an unpredictable state.
final void stop()
This method is deprecated. because stopping a thread in this manner is unsafe and can leave your application and the VM in an unpredictable state
但是,通過說明我們可以看到,這些方法Android本身都是不推薦使用的,通過這種方式結束執行緒是不安全的,可能會讓我們的應用退出,並且會讓虛擬機器處於一種無法預料的狀態。那麼開發過程中,在合情合理的需求中,我們怎麼去安全的結束指定的自定義執行緒呢?筆者來救贖了。
1. 我們可以在自定義執行緒類中定義一個布林私有變數,並且初始化為假,用於記錄執行緒的執行狀態。
2. 在run函式開始,設定該變數為真,表示執行緒進入執行狀態。
3. 在run函式結束位置,設定該變數為假,表示執行緒進入結束狀態。
4. 在run的執行緒執行部分,我們可以找一些鍥點,對該變數進行判斷,如果為真則繼續執行,否則退出run函式。
5. 在自定義執行緒類中再提供一個公共函式,該函式的作用是將上述狀態變數設定為假。
這樣,當自定義執行緒執行還未結束時,我們就可以通過呼叫5中的方法將執行緒安全結束。
思想的本質就是,既然我們不能安全強制結束執行緒,那我們就讓它安全地提前退出。效果是一樣的。
程式例項 :
class SearchThread extends Thread
{
private boolean isRun = false ;
public SearchThread()
{
isRun = false ;
}
public void setStopState()
{
isRun = false ;
}
@Override
public void run()
{
isRun = true ;
……
//---執行緒執行部分,僅僅舉例為了說明-----
for(int i = 0; i < 100; i++)
{
if(isRun == false) return ;
……
for(int j = 0; j < 100; j++)
{
if(isRun == false) return ;
……
}
}
//-----end----------
……
}
}
相關文章
- Android : 執行緒的結束,掛起和恢復(下)Android執行緒
- 執行緒的掛起與恢復執行緒
- Linux中執行緒的掛起與恢復(程式暫停)Linux執行緒
- Java:多執行緒等待所有執行緒結束(CountDownLatch/CyclicBarrier) .Java執行緒CountDownLatch
- 3.5 掛起和恢復資料庫資料庫
- Android的執行緒和執行緒池Android執行緒
- python多執行緒程式設計2—執行緒的建立、啟動、掛起和退出Python執行緒程式設計
- Win32執行緒——等待另一個執行緒結束Win32執行緒
- 資料庫的掛起(suspending)和恢復(resuming)資料庫
- java 如何實現等待子執行緒結束Java執行緒
- Windows10 VS2017 C++多執行緒傳參和等待執行緒結束WindowsC++執行緒
- ManualResetEvent實現執行緒的暫停與恢復執行緒
- 請教關於執行緒的結束問題,急!!!執行緒
- oracle資料庫的掛起(Suspending)和恢復(Resuming)Oracle資料庫
- android程式和執行緒Android執行緒
- Android 程式和執行緒Android執行緒
- Android多執行緒總結Android執行緒
- 7.6 實現程式掛起與恢復
- _11_GCD相關-掛起/恢復GC
- 和朱曄一起復習Java併發(一):執行緒池Java執行緒
- 多執行緒:執行緒池理解和使用總結執行緒
- Android中子執行緒更新主執行緒UI和ProgressBar的應用Android執行緒UI
- 瞭解 Android 的程式和執行緒Android執行緒
- 掌握Android中的程式和執行緒Android執行緒
- Android的程式與執行緒使用總結Android執行緒
- 04_FreeRTOS的任務掛起與恢復
- Control的Invoke和BeginInvoke 是相對於支線執行緒(因為一般在支線執行緒中呼叫,用來更新主執行緒ui)Invoke立即插入主執行緒中執行,而BeginInvoke 要等主執行緒結束才執行執行緒UI
- android 主執行緒和子執行緒之間的訊息傳遞Android執行緒
- 執行緒和執行緒池執行緒
- 轉:基礎知識:檢測執行緒是否結束的方法收藏執行緒
- 淺談執行緒池(上):執行緒池的作用及CLR執行緒池執行緒
- 多執行緒-程式和執行緒的概述執行緒
- Android多執行緒之執行緒池Android執行緒
- 程式執行緒篇——執行緒切換(上)執行緒
- RMAN恢復 執行重要檔案RMAN恢復
- SQLServer資料庫恢復掛起的解決辦法SQLServer資料庫
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- 鉑金07:整齊劃一-CountDownLatch如何協調多執行緒的開始和結束CountDownLatch執行緒