【问题标题】:What will happen when AsyncTasks are full?当 AsyncTasks 满时会发生什么?
【发布时间】: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


【解决方案1】:

如果我在已经达到 MAXIMUM_POOL_SIZE 时再调用一个 executeOnExecutor() 会发生什么,所有线程都在运行,并且 sPoolWorkQueue 已满。

你会得到一个RejectedExecutionException

【讨论】:

  • 谢谢!我可以再问你一个问题吗? AsyncTask.SERIAL_EXECUTOR 也是如此吗?我的意思是,当 sPoolWorkQueue 已满时调用另一个 execute()?
  • @Jenix:我不这么认为。 SerialExecutor 的编写方式似乎有无限的ArrayDeque 待处理任务,并且一次只将一个交给标准ThreadPoolExecutor。因此,AFAICT,在堆空间用完之前没有上限。
  • 啊,我明白了。但是 sPoolWorkQueue 本身呢? 'new LinkedBlockingQueue(128)' 意味着它将限制为 128,对吧?
  • @Jenix:除了SerialExecutor 用作门外,SerialExecutor 一次最多只能向该队列贡献一个任务。
猜你喜欢
  • 2015-09-14
  • 2015-07-04
  • 2015-09-14
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
相关资源
最近更新 更多