gpt4 book ai didi

android - 来自 AsyncTask 的 RejectedExecutionException,但未达到限制

转载 作者:IT老高 更新时间:2023-10-28 23:19:08 25 4
gpt4 key购买 nike

我的 Android 应用必须处理经常成群出现的消息(尤其是在连接不稳定的时期)。我在 AsyncTasks 中处理这些传入消息,这样我就不会干扰 UI 线程。如果一次收到太多消息,我会收到 RejectedExecutionException。我的错误堆栈如下所示:

10-22 14:44:49.398: E/AndroidRuntime(17834): Caused by: java.util.concurrent.RejectedExecutionException: Task android.os.AsyncTask$3@414cbe68 rejected from java.util.concurrent.ThreadPoolExecutor@412716b8[Running, pool size = 128, active threads = 22, queued tasks = 0, completed tasks = 1323]
10-22 14:44:49.398: E/AndroidRuntime(17834): at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1967)
10-22 14:44:49.398: E/AndroidRuntime(17834): at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:782)
10-22 14:44:49.398: E/AndroidRuntime(17834): at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1303)
10-22 14:44:49.398: E/AndroidRuntime(17834): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:564)

我正在使用 task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) 运行任务,以便并行处理传入消息。

令人困惑的是,与我能找到的相关 StackOverflow 问题(例如 herehere )不同的是, Activity 线程和排队任务的数量似乎并没有与限制(似乎分别是 128 和 10)。查看堆栈跟踪:

ThreadPoolExecutor@412716b8[正在运行,池大小 = 128, Activity 线程 = 22,排队任务 = 0,已完成任务 = 1323]

为什么我会收到此错误消息?

最佳答案

Why would I be getting this error message?

如果 ThreadPoolExecutor 仍在运行,只有当您超过 ThreadPoolExecutor 可以排队的任务数时,您才会收到此错误消息。 RejectedExecutionException 的唯一一次抛出是由 ThreadPoolExecutor.AbortPolicy 引发,这是默认的 RejectedExecutionHandler

引用 javadocs :

If a request cannot be queued, a new thread is created unless this would exceed maximumPoolSize, in which case, the task will be rejected.

有最大数量的任务。在此处查看此问题/答案:Is there a limit of AsyncTasks to be executed at the same time?

这里是 AsyncTask 的源代码链接.

private static final int CORE_POOL_SIZE = 5;
private static final int MAXIMUM_POOL_SIZE = 128;

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

private static final ThreadPoolExecutor sExecutor =
new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE,
KEEP_ALIVE, TimeUnit.SECONDS, sWorkQueue, sThreadFactory);

所以看起来它从 5 个线程开始,有 10 个队列。一旦队列满了,它最多可以启动 128 个线程。因此,您的并发请求似乎已超过 138 个。

ThreadPoolExecutor@412716b8[Running, pool size = 128, active threads = 22, queued tasks = 0, completed tasks = 1323]

试图在 ThreadPoolExecutor 空间耗尽的那一刻捕捉到它会非常困难,它会很快变成 heisenbug因为您查看 ThreadPoolExecutor 编号的次数越多,您将越多地影响该类的同步,因此您可能会消除错误。

在您的情况下,当您使用有关 TPE 的详细信息记录异常时,条件必须已经通过。

关于android - 来自 AsyncTask 的 RejectedExecutionException,但未达到限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19529309/

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