2017-07-27 174 views
0

在Android中7.0:當AsyncTasks已滿時會發生什麼?

private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4)); 
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1; 
private static final int KEEP_ALIVE_SECONDS = 30; 
private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(128); 

CORE_POOL_SIZE是初始線程的數目。 MAXIMUM_POOL_SIZE表示隊列滿時的最大線程數sPoolWorkQueue存儲等待輪到它運行的任務。

如果我的手機有4個處理器,我可以在最多137個任務中同時撥打executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)

所以,如果我叫會發生什麼一個更executeOnExecutor()時已經達到MAXIMUM_POOL_SIZE,所有正在運行的線程,並sPoolWorkQueue已滿。

儘管這種情況很少見,但我很好奇,因爲前幾天我讀過某人的舊帖子,稱AsyncTask的限制導致了他的項目崩潰。他說,他對任務的數量限制爲128 ..

+1

另外['ThreadPoolExecutor'](https://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html)「拒絕任務」部分的文檔。 Ps:當隊列仍然爲空時,您已達到MAXIMUM_POOL_SIZE,因爲只要有任務且沒有空閒線程,它就會擴展。一旦所有線程都忙碌,您會在隊列中看到積壓。儘管如此,降低游泳池的尺寸將停止在CORE線程上。 – zapl

+0

@zapl我不知道,謝謝! – Jenix

回答

2

所以纔會如果我叫一個多executeOnExecutor()發生什麼的時候就已經達到MAXIMUM_POOL_SIZE,所有正在運行的線程,並且sPoolWorkQueue已滿。

你得到一個RejectedExecutionException

+0

謝謝!我能再問你一個問題嗎? AsyncTask.SERIAL_EXECUTOR也是如此?我的意思是,當sPoolWorkQueue已滿時調用另一個execute()。 – Jenix

+1

@日本:我不這麼認爲。 'SerialExecutor'的編寫方式,它似乎有一個無限的'ArrayDeque'具有待處理的任務,並且每次只能向標準的'ThreadPoolExecutor'提交一個。因此,AFAICT沒有上限,直到你用完堆空間。 – CommonsWare

+0

啊,我明白了。但是sPoolWorkQueue本身呢? '新的LinkedBlockingQueue (128)'表示它將限制爲128,對吧? – Jenix

相關問題