2012-03-07 11 views
6

這應該有一個簡單的答案,但我找不到任何。 由於我仍然是一個機器人假人,我來這裏問你的人。是否有限制的AsyncTasks同時執行?

我一直在做這個項目,在啓動時執行10個AsyncTasks。 每個任務都包含3個URL,用於收集數據並在應用程序中執行任何重要操作(還)。

我也有10個textviews,我用它來跟蹤AsyncTasks的進度。

當一個任務啓動相應的TextView放在「啓動」 當任務進展它會將其適當的TextView「下載」 當任務完成後它會將其適當的TextView爲「完成」

這就是我觀察到的對AsyncTask的質疑。 當我啓動應用程序時,我注意到5個文字瀏覽被切換到「下載」標記,所以我看到5個AsyncTasks按照他們應該做的工作。完成後,它啓動一個新的AsyncTask。然而他們從未達到5的極限。

是什麼原因導致5個AsynchTasks同時運行的限制? 我在一些我無法找到的文件中導致這個問題? 這是Android 2.3.3的限制嗎?也許我正在用來模擬應用程序的設備的限制?

任何人都可以爲我詳細說明嗎?

+0

這個問題在這裏解決:http://stackoverflow.com/questions/3077461/asynctask-threads-never-die-android – jengelsma 2012-03-07 00:18:36

+0

@jengelsma不是真的。這絕對是相關的,但爲什麼它沒有超過5與爲什麼永遠不會超過5不同。它仍然與核心池大小有關,但這個問題/答案沒有解決爲什麼核心池大小會限制當最大池大小爲128時,併發任務的數量爲5個。 – kabuko 2012-03-07 01:01:40

+0

我認爲您使用的是AsyncTask.execute()而不是AsyncTask.executeOnExecutor() – 2015-10-20 09:33:43

回答

8

是的,有一個限制。 AsyncTaskThreadPoolExecutor提供支持,核心池大小爲5,但最大池大小爲128(從1.6 - 4.0.3),所以我認爲您應該看到所有10個同時運行。你不能改變它。如果你真的想做一些不同的事情(除非你有一個非常明確的理由,否則我不會推薦它),你必須做一些自定義的更大的池大小或者手動啓動一堆線程。

更新:

這裏是什麼文件說:

如果不是maximumPoolSize線程運行有超過corePoolSize,但少,一個新的線程將被只有在隊列已滿創建。

所以這就是爲什麼。你的隊列沒有滿,所以它只是保持在覈心池的大小。

+0

以下是指向[AsyncTask]源代碼的鏈接(http:// grepcode .com/file/repository.grepcode.com/java/ext/com.google.android/android/1.6_r2/android/os/AsyncTask.java#AsyncTask)以供參考。 – kabuko 2012-03-07 00:14:59

+2

如果你想自定義你的AsyncTask的處理方式,你可以爲'executeOnExecutor()'提供一個任意的'Executor'實例。 – Argyle 2012-03-07 01:19:53

+1

@Argyle好點;對於API 11以上來說這是一個很好的選擇。 – kabuko 2012-03-07 01:22:21

0

ThreadPoolExecutor有一個corePoolSize,一個maxPoolSize和一個QueueCapacity。 如果使用了來自corePoolSize的所有線程,則將任何其他任務放入核心池中每個線程的隊列中。在這些隊列已滿後,只要它處於maxPoolSize的範圍內,就會初始化一個新線程。

這裏的問題在於,每個線程的隊列(除非以編程方式更改)是UNBOUNDED。這意味着您將使用來自核心池大小的所有線程,並且任何其他任務都會排隊等待其核心線程中的一個。他們從來沒有機會達到最大池大小。

您必須配置您自己的執行程序並更改隊列容量。祝你好運!

相關問題