Android : 執行緒的結束,掛起和恢復(下)
二. 執行緒的掛起與恢復
同樣, Android執行緒類也提供了一些公共方法去掛起和恢復執行緒:
final void resume()
This method is deprecated. Used with deprecated method suspend
final void suspend()
This method is deprecated. May cause deadlocks
同樣不幸的是,通過說明我們可以看到,這些方法Android也是不推薦使用的,經過筆者試驗,這些方法也沒有效果。那我們如何去掛起和恢復執行緒呢?筆者又來救贖了。
Android的類基本都是繼承於Object類。此類可以說是Android類的祖先了。如果把Android類比喻為一個生物界,則Object類就是當初生命誕生時候的那個單細胞。
我們可以發現Object類提供了幾個方法 :
final void notify()
Causes a thread which is waiting on this object's monitor (by means of calling one of the wait() methods) to be woken
final void notifyAll()
Causes all threads which are waiting on this object's monitor (by means of calling one of the wait() methods) to be woken
final void wait()
Causes the calling thread to wait until another thread calls the notify() ornotifyAll() method of this object
通過說明我們可以知道,wait方法可以讓正在呼叫的執行緒處於等待狀態,直到其他執行緒呼叫了該物件的notify 或者notifyAll,而notify 和notifyAll方法則是用於喚醒處於等待中的執行緒。
同樣,執行緒類也是繼承於Object類,但是執行緒類是一個比較特殊的類,有自己獨立的棧機制來處理其方法,引數和區域性變數。通過實驗,筆者發現,雖然執行緒類繼承於Object類,但是卻不能通過wait和notify方法掛起喚醒執行緒。而要實現上述動作,必須去間接地實現,即在自定義執行緒類中建立一個Object物件,然後通過對該Object的相關操作實現執行緒的掛起和喚醒。方法如下:
1. 在自定義執行緒類的例項化過程中建立一個Object物件。
2. 定義一個變數來記錄執行緒的狀態是否掛起,初始化為假。
3. 線上程類中的run函式中的執行緒執行部分找入鍥點來執行下面動作:如果當前狀態變數為假(表示執行緒掛起),則通過1中Object物件的wait方法掛起當前執行緒,即執行緒暫停在鍥點位置,如果被喚起,則將從鍥點後繼續執行。
4. 定義一個方法來修改執行緒狀態變數為真,從而達到掛起執行緒的目的。
5. 定義一個方法去喚醒執行緒。判斷如果執行緒狀態變數為真,則修改其為假,然後呼叫1中Object物件的notifyAll方法喚醒物件。(notify方法也可以,但是如果自定義執行緒較多時容易造成死鎖)。
綜上,當自定義執行緒執行後我們可以通過4中的方法掛起執行緒,通過5中的方法喚醒執行緒。
程式例項 :
class SearchThread extends Thread
{
private Object mPauseLock ;
private boolean mPauseFlag ;
public SearchThread()
{
mPauseLock = new Object() ;
mPauseFlag = false ;
}
public void onPause()
{
synchronized (mPauseLock) {
mPauseFlag = true;
}
}
public void onResume()
{
synchronized (mPauseLock) {
mPauseFlag = false ;
mPauseLock.notifyAll() ;
}
}
private void pauseThread()
{
synchronized (mPauseLock) {
if(mPauseFlag)
{
try{
mPauseLock.wait() ;
}catch(Exception e){
Log.v("thread", "fails") ;
}
}
}
}
@Override
public void run()
{
……
//---執行緒執行部分,僅僅舉例為了說明-----
for(int i = 0; i < 100; i++)
{
pauseThread() ;
……
for(int j = 0; j < 100; j++)
{
pauseThread() ;
……
}
}
//-----end----------
……
}
}
相關文章
- 3.5 掛起和恢復資料庫資料庫
- Win32執行緒——等待另一個執行緒結束Win32執行緒
- android程式和執行緒Android執行緒
- Windows10 VS2017 C++多執行緒傳參和等待執行緒結束WindowsC++執行緒
- ManualResetEvent實現執行緒的暫停與恢復執行緒
- 【伺服器資料恢復】linux下執行FSCK後無法掛載的資料恢復案例伺服器資料恢復Linux
- 瞭解 Android 的程式和執行緒Android執行緒
- 多執行緒:執行緒池理解和使用總結執行緒
- 2019Android多執行緒總結Android執行緒
- 4.2019Android多執行緒總結Android執行緒
- 7.6 實現程式掛起與恢復
- Linux 系統程序掛起與恢復Linux
- 和朱曄一起復習Java併發(一):執行緒池Java執行緒
- 04_FreeRTOS的任務掛起與恢復
- Android多執行緒之執行緒池Android執行緒
- Android的Java多執行緒部簡介和Synchronized學習總結AndroidJava執行緒synchronized
- Android程式框架:執行緒與執行緒池Android框架執行緒
- Android執行緒池Android執行緒
- Rust 程式設計影片教程(進階)——016_2 建立執行緒與等待執行緒結束Rust程式設計執行緒
- Android中的執行緒池Android執行緒
- 執行緒和執行緒池執行緒
- 走進Java Android 的執行緒世界(二)執行緒池JavaAndroid執行緒
- 執行緒、開啟執行緒的兩種方式、執行緒下的Join方法、守護執行緒執行緒
- Java CompletableFuture:allOf等待所有非同步執行緒任務結束Java非同步執行緒
- Rust 程式設計視訊教程(進階)——016_2 建立執行緒與等待執行緒結束Rust程式設計執行緒
- Android中後臺的服務和多執行緒Android執行緒
- sqlsever處理資料庫的恢復掛起狀態SQL資料庫
- SQLServer資料庫恢復掛起的解決辦法SQLServer資料庫
- 鉑金07:整齊劃一-CountDownLatch如何協調多執行緒的開始和結束CountDownLatch執行緒
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- Android中的執行緒通訊Android執行緒
- Android JNI 中的執行緒操作Android執行緒
- Android多執行緒+單執行緒+斷點續傳+進度條顯示下載Android執行緒斷點
- 程式執行緒篇——執行緒切換(下)執行緒
- Windows下繫結執行緒到指定的CPU核心Windows執行緒
- 多執行緒和多執行緒同步執行緒
- 在Linux中,如何檢視和結束正在執行的程序?Linux
- 一起分析執行緒的狀態及執行緒通訊機制執行緒
- 多執行緒下的list執行緒