gpt4 book ai didi

android - 从 AsyncTask.THREAD_POOL_EXECUTOR 中删除并终止所有任务

转载 作者:搜寻专家 更新时间:2023-11-01 08:55:32 24 4
gpt4 key购买 nike

我想在 AsyncTask.THREAD_POOL_EXECUTOR 上运行多个 AsyncTask。我正在使用以下代码。

Tasks[i].executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
taskParams);

一定数量的线程被发送到执行器后,它不再接受新的 AsyncTasks。 (我没有看到任何错误,但是 doInBackGroundMethod 由于某种原因没有启动)。

我怀疑发生这种情况是因为它的池已满。有没有办法重置执行者?我想完全终止所有任务,以便它重新开始接受新任务并立即处理它们。

我尝试使用他们的cancel 方法终止任务,但没有帮助。

最佳答案

你的任务完成了吗?您是否正在处理适当的异常?您要创建多少个任务?

请记住,AsyncTask.THREAD_POOL_EXECUTOR(至少在 API 17 中;此文档页面包含大量有用的详细信息)是通过

设置的
public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);

CORE_POOL_SIZE 为 5,MAXIMUM_POOL_SIZE 为 128。

sPoolWorkQueue 与

private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(10);

这意味着队列的最大容量为 10 个项目。

THREAD_POOL_EXECUTOR 保持至少 5 个线程处于 Activity 状态。添加任务时,它们会添加到队列中。当队列填满时,将产生新的线程,最多 128 个(但还有其他限制)。

当这种情况发生时(最大 128 个线程正在运行并且队列已满),那么任何新任务都将被拒绝,并使用默认处理程序进行处理(因为它没有被显式设置,是 AbortPolicy),它会抛出一个 RejectedExecutionException .

确保您不只是捕获而不处理此类异常。

处理此问题的一种方法是创建您自己的 ExecutorService (即使它只是具有不同参数的 ThreadPoolExecutor 实例)并配置最适合您情况的参数。队列等参数(您可以控制它可以容纳的项目数量,或者它是否不受限制等)或如何处理被拒绝的任务。

关于android - 从 AsyncTask.THREAD_POOL_EXECUTOR 中删除并终止所有任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19262114/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com