2015-08-14 66 views
3

在Android AsyncTask類的doInBackground()函數中運行多線程代碼會有性能優勢嗎?這是我的計劃的粗略草圖:AsyncTask doInBackground中的多線程代碼

private class MyBackgroundTask extends AsyncTask<Integer, Integer, Integer> 
{ 
    protected Integer doInBackground(Integer... vals) 
    { 
     Thread[] thrds = new Thread[NUM_THREADS]; 
     //Start all threads 
     for(int i = 0; i < thrds.length; ++i) 
     { 
      thrds[i] = //Initialize threads 
      thrds[i].start(); 
     } 
     //Wait for all threads to finish 
     for(int i = 0; i < thrds.length; ++i) 
      thrds[i].join(); 
     //Post processing... 
     return foo; 
    } 

    protected void onPostExecute(Integer res) 
    { 
     //Pass value back to UI class 
    } 
} 

這會產生新的線程,可以利用多核設備上的優勢嗎?例如,如果每個線程都在一個(非常大)的數組中搜索最大值,那麼多核設備上的性能是否會提高?或者這會導致「多對一」行爲。

還有一件事,我想要使用線程的多線程而不是調用多個AsyncTasks,因爲多線程最終將處理域級處理。我強烈希望從UI類中分離域級別的處理,以便我可以在不同的UI中重用域級別的類。

在此先感謝。

+1

有趣的問題,我也很好奇,如果你可以通過利用多線程加速任務。 –

+0

取決於任務。計算時,有明顯的優勢(因爲num_cores計算是同時執行的,但是如果你的線程正在訪問一些低速資源(例如,相同的磁盤存儲),它們甚至可能比單線程慢。在只進行內存掃描的情況下(在數組中尋找最大值)取決於處理器架構,特別是緩存組織。核心的公共緩存將增加緩存缺失的數量。 – AterLux

+0

@AterLux是指一般的多線程,還是特指doInBackground()函數中的多線程? – nickandross

回答

0

萬一其他人想知道:

是的,有可能成爲一個性能加速。the image I posted in an above comment可以看出,在ASyncTask上啓動新線程會導致多對多的行爲(假設多核設備)。就我而言,我在問題中發佈的解決方案類型對我來說效果很好。正如其他人所指出的那樣,ASyncTask確實有一些需要妥善處理的細節。然而,在我看來,這更多地與多線程編程有關,而不是ASyncTask本身的問題。

0

您應該使用AsyncTask,用Thread#start()產生自己的線索或使用java.util.concurrent.Executor。你不可能想要把這些東西結合起來。

AsyncTask默認情況下,類爲您的進程提供了一個與UI線程截然不同的線程。其原因主要是爲了確保任務始終按照開始的順序完成。如果這對您沒有問題,那麼AsyncTask允許您指定要運行的其他Executor,並且提供了一個已調整爲擁有理想尺寸的池,以針對目標處理器上的核心數調整的優秀池。

運行任務的數組,像這樣:

AsyncTask[] tasks = ... 
for (Task task : tasks) { 
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); 
} 

對於好奇的Android平臺中的代碼看起來是這樣的:

private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors(); 
private static final int CORE_POOL_SIZE = CPU_COUNT + 1; 
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1; 
private static final int KEEP_ALIVE = 1; 

/** 
* An {@link Executor} that can be used to execute tasks in parallel. 
*/ 
public static final Executor THREAD_POOL_EXECUTOR 
     = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, 
       TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory); 
0

纔會有性能優勢,在運行多線程android AsyncTask類的doInBackground()函數中的代碼?

沒有,對我來說你的想法介紹更加混亂比普通AsyncTask呢,看看谷歌說,關於「什麼是錯的AsyncTask」,例如The Hidden Pitfalls of AsyncTask

相關問題