【发布时间】:2017-07-27 15:07:01
【问题描述】:
在 Android 7.0 中:
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 个处理器,我最多可以同时调用 executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) 处理 137 个任务。
如果我在已经达到 MAXIMUM_POOL_SIZE 时再调用一个 executeOnExecutor() 会发生什么,所有线程都在运行,并且 sPoolWorkQueue 是满了。
虽然这种情况很少见,但我真的很好奇,因为几天前我读到某人的旧帖子说 AsyncTask 的限制导致他的项目崩溃。他说他必须将任务数量限制在 128 个..
【问题讨论】:
-
“被拒绝的任务”部分中还有
ThreadPoolExecutor文档。 Ps:当队列仍然为空时,您已经到达MAXIMUM_POOL_SIZE,因为一旦有任务并且没有空闲线程,它就会扩展。一旦所有线程都忙起来,您将在队列中看到积压。不过,缩小池将在 CORE 线程处停止。 -
@zapl 我不知道,谢谢!
标签: java android multithreading android-asynctask