Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中的多線程處理(二)——使用線程池中的線程

Android中的多線程處理(二)——使用線程池中的線程

編輯:關於Android編程

為了利用線程池中的線程來執行任務,我們需要將要執行的任務添加到線程池所維護的任務隊列中。當線程池中的某個線程可用時,ThreadPoolExecutor就會從任務隊列中取出一個任務交給該線程來執行。同時,當我們啟動了一個任務後隨後發現該任務不再需要時,我們還可以通過取消線程來停止線程池中的線程正在運行的任務。


任務交由線程池中的線程來執行
通過將一個任務Runnable對象傳遞給ThreadPoolExecutor類的execute()方法,即可啟動線程池中的一個可用線程來執行該任務。該方法首先將這個任務加入到線程池的工作隊列中,當線程池中有可用線程時,ThreadPoolExecutor就會取出任務隊列中等待時間最長的任務交給該線程來執行。下面的例子很好地說明了這一點:
public class PhotoManager

{
public void handleState(PhotoTask photoTask, int state)

{
switch (state)

{
//前一個任務執行完成後,本例中為下載完網絡圖片
case DOWNLOAD_COMPLETE:
//啟動對下載完的圖片的解碼任務
mDecodeThreadPool.execute(
photoTask.getPhotoDecodeRunnable());
...
}
...
}
...
}
當ThreadPoolExecutor把一個任務Runnable對象交給一個線程來執行時,它會自動調用該任務對象的run()方法。


中斷任務的執行
為終止一個任務,我們需要中斷運行該任務的線程。為實現這一點,我們需要在創建任務時保存一個對執行該任務的線程的引用。如下面的例子所示:
class PhotoDecodeRunnable implements Runnable

{
public void run()

{
/*
* 將該任務執行時啟用的線程引用保存下來
* 後面就可以通過mPhotoTask.getImageDecodeThread()
* 來獲取到執行該任務的線程的引用
*/
mPhotoTask.setImageDecodeThread(Thread.currentThread());
...
}
...
}

對線程的中斷是通過調用Thread類的interrupt()方法來實現的。需要注意的是,線程對象是由系統來維護的,因此線程對象是有可能在我們應用的進程之外被系統修改。基於這一點,在我們中斷一個線程之前需要對該線程加鎖,這是通過synchronized同步塊來實現的,如下面的例子所示:
public class PhotoManager

{
public static void cancelAll()

{
/*
* 創建線程池任務隊列的副本
*/
Runnable[] runnableArray = new Runnable[mDecodeWorkQueue.size()];
mDecodeWorkQueue.toArray(runnableArray);

int len = runnableArray.length;
/*
* 將對線程的中斷操作放在一個同步塊中
*/
synchronized (sInstance)

{
for (int runnableIndex = 0; runnableIndex < len; runnableIndex++)

{
//獲取任務所在線程的引用
Thread thread = runnableArray[taskArrayIndex].mThread;
//線程存在則中斷它
if (null != thread)

{
thread.interrupt();
}
}
}
}
...
}

在多數情況下,Thread.interrupt()會立即停止該線程的運行。然而,這種中斷只能停止處於等待狀態的線程,而不會中斷那些非常占CPU或網絡密集型的任務。為避免降低系統的運行速度或鎖住系統,在使用當前線程去執行一個操作前我們需要測試是否還有掛起的中斷請求,如下面的代碼所示:
/*
* 在繼續操作之前,檢測當前線程是否被中斷,若是被中斷則不再繼續後面的操作
*/
if (Thread.interrupted())

{
return;
}
...
//當前線程未被中斷則可繼續執行操作(通常為一個非常占用CPU的操作)
BitmapFactory.decodeByteArray(
imageBuffer, 0, imageBuffer.length, bitmapOptions);
...


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved