2017-07-27 123 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

相关问题