线程池执行器异常

Posted

技术标签:

【中文标题】线程池执行器异常【英文标题】:ThreadPoolExecutor Exception 【发布时间】:2021-04-11 23:09:53 【问题描述】:

在使用该应用程序时,我遇到了这个异常。这不是特定情况发生的。有时打开一个片段,有时将文本设置为 textview。所以我没有正确理解这个问题。

你能说点什么吗?

这是我得到的最后一个异常日志

Task android.os.AsyncTask$SerialExecutor$1@373f483 rejected from java.util.concurrent.ThreadPoolExecutor@b9965c7[Running, pool size = 9, active threads = 9, queued tasks = 128, completed tasks = 31]

java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2014)

java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:794)

java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1340)

android.os.AsyncTask$SerialExecutor.scheduleNext(AsyncTask.java:247)

android.os.AsyncTask$SerialExecutor.execute(AsyncTask.java:241)

android.os.AsyncTask.execute(AsyncTask.java:622)

android.widget.TextView.updateTextServicesLocaleAsync(TextView.java:8711)

android.widget.TextView.getTextServicesLocale(TextView.java:8658)

android.widget.TextView.getSpellCheckerLocale(TextView.java:8704)

android.widget.SpellChecker.<init>(SpellChecker.java:112)

android.widget.Editor.updateSpellCheckSpans(Editor.java:658)

android.widget.Editor.onAttachedToWindow(Editor.java:353)

android.widget.TextView.onAttachedToWindow(TextView.java:5262)

android.view.View.dispatchAttachedToWindow(View.java:14520)

android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843)

android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843)

android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843)

android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843)

android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843)

android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843)

android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843)

android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843)

android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2843)

android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1364)

android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)

android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6007)

android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)

android.view.Choreographer.doCallbacks(Choreographer.java:670)

android.view.Choreographer.doFrame(Choreographer.java:606)

android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)

android.os.Handler.handleCallback(Handler.java:739)

android.os.Handler.dispatchMessage(Handler.java:95)

android.os.Looper.loop(Looper.java:148)

android.app.ActivityThread.main(ActivityThread.java:5417)

java.lang.reflect.Method.invoke(Native Method)

com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)

com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

我的每个线程都这样调用,我不使用 AsyncTask s

new Thread(new Runnable() 

            public void run() 

                ...
            
        ).start();

【问题讨论】:

可以贴一个代码示例以便更好地理解吗?这将非常有帮助 云你发布代码块导致异常?这对调试很有好处。 @faysalneowaz 没有特定的代码部分。此日志来自用户。我也不知道确切的场景。 【参考方案1】:

这是一个 RejectedExecutionException,我认为是 AsyncTask 中的 execute() 抛出的。

发生这种情况有两个原因:

    您的线程池已满(在这种情况下,9/9 线程正在使用中) 你的线程池对象被销毁了

按照您的第一个原因,您可以通过等待创建的一个线程完成它的任务,然后通过 get 函数创建一个新线程来处理您的线程池:

execute().get();

【讨论】:

您能否提供更多代码。我已经更新了我的答案。我该如何使用这个 execute().get(); 您好,从您的编辑中,您可以使用诸如 wait() 之类的东西来等待线程执行完成,这种方法的问题是它阻塞了您的 UIThread。您应该使用 AsyncTask 让 Android Evironment 在后台为您处理它,并提供更多资源。

以上是关于线程池执行器异常的主要内容,如果未能解决你的问题,请参考以下文章

线程池中某个线程执行有异常,该如何处理?

线程池中某个线程执行有异常,该如何处理?

面试官:线程池执行过程中遇到异常会发生什么,怎样处理?

面试官:线程池执行过程中遇到异常会发生什么,怎样处理?

面试官:线程池执行过程中遇到异常会发生什么,怎样处理?

线程重复执行问题与线程池