Android 拒绝AsyncTask中的ExecutionException,但避风港';他没有达到极限

Android 拒绝AsyncTask中的ExecutionException,但避风港';他没有达到极限,android,multithreading,Android,Multithreading,我的Android应用程序必须处理频繁出现的大量信息(特别是在连接不稳定的时期)。我在异步任务中处理这些传入消息,这样就不会干扰UI线程。如果一次收到的消息太多,我会收到一个RejectedExecutionException。我的错误堆栈如下所示: 10-22 14:44:49.398: E/AndroidRuntime(17834): Caused by: java.util.concurrent.RejectedExecutionException: Task android.os.Asy

我的Android应用程序必须处理频繁出现的大量信息(特别是在连接不稳定的时期)。我在异步任务中处理这些传入消息,这样就不会干扰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\u POOL\u EXECUTOR)
运行任务,以便并行处理传入消息

令人困惑的是,与我能找到的相关StackOverflow问题(例如和)不同的是,活动线程和排队任务的数量似乎没有达到限制(分别为128和10)。请参阅stacktrace:

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

为什么我会收到这个错误消息

为什么我会收到这个错误消息

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

引自:

如果请求无法排队,则会创建一个新线程,除非该线程将超过maximumPoolSize,在这种情况下,任务将被拒绝

有一个最大数量的任务。请参见此处的问题/答案:

下面是的源代码链接

private static final int CORE\u POOL\u SIZE=5;
私有静态最终整数最大池大小=128;
专用静态最终阻塞队列sWorkQueue=
新的LinkedBlockingQueue(10);
私有静态最终线程池执行器sExecutor=
新的ThreadPoolExecutor(核心池大小、最大池大小、,
保持_活动,TimeUnit.SECONDS,sWorkQueue,sthread factory);
看起来它从5个线程开始,有一个10个线程的队列。一旦队列已满,它最多可以启动128个线程。因此,看起来您已超过138个同时请求

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

试图捕捉
ThreadPoolExecutor
耗尽空间的确切时刻将是非常困难的,它将很快变成一个错误,因为您越是查看
ThreadPoolExecutor
编号,您就越会影响该类的同步,因此您可能会使错误消失


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

如果您的执行者调用shutdown方法,并且在此之后您为执行提供了新任务(Runnable),则也会发生此异常。 像


我很欣赏这个摘要,但是根据错误消息,我有22个活动线程和0个排队线程。(即小于128和10。)您是在暗示错误消息以某种方式报告了错误的信息,还是我读错了?我是说TPE抛出
拒绝执行异常的唯一方式是超过128和10。此时您可能只有22个活动节点,但我怀疑它超过了它,因为@abeboparebop.1的流量激增。您如何知道只有在这种情况下才会抛出
RejectedExecutionException
?我在您链接到的
AsyncTask
源代码中找不到对它的任何引用。2.鉴于错误消息提供了误导性信息,我如何明确验证128/10限制?1。我知道,因为我在abeboparebop上看过很多TPE代码。我不确定的是您的Android版本的
AsyncTask
的设置。它可能不是128/10限制,但唯一抛出REE的时间是从
AbortPolicy
抛出的,这是默认被拒绝的处理程序。我仍然被令人困惑的消息所困扰(我们没有使用非标准版本的Android或任何东西),但我将接受这个答案,因为这看起来是明确的。我面临这个问题。。。如果我们调用
shutDown()
shutDownNow()
,那么我们需要再次实例化
mthreadpooleexecutor
mthreadpooleexecutor=Executors.newScheduledThreadPool(2)找到解决方案了吗?我相信接受的答案是正确的,但我始终不理解错误消息中活动线程的数量为什么低于限制(即22而不是128)。可能在抛出错误时,一些以前活动的线程已经结束。
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);
mThreadPoolExecutor.shutdown();
...
...
...
mThreadPoolExecutor.execute(new Runnable(){...});