【问题标题】:Get default ThreadPoolExecutor?获取默认的 ThreadPoolExecutor?
【发布时间】:2014-06-21 14:25:10
【问题描述】:

我正在制作一个 Android 应用程序,但遇到 RejectedExecutionException 出现问题(可能是由于过度使用 AsyncTask)。我想获取默认的ThreadPoolExecutor 并阅读getTaskCount()getCompletedTaskCount()

如何在不手动创建实例的情况下获得ThreadPoolExecutor 的实例?

【问题讨论】:

    标签: android threadpoolexecutor


    【解决方案1】:

    就在 AsyncTask 的文档中。那里有两个。他们被称为

    AsyncTask.SERIAL_EXECUTOR
    

    AsyncTask.THREAD_POOL_EXECUTOR
    

    分别。

    请注意,这两个执行器使用完全相同的多线程支持执行器来执行。串行执行器不是单线程的!它只是在它前面有一个出队,它强制执行任务的串行执行。

    【讨论】:

      【解决方案2】:

      Android AsyncTask 框架有两个默认执行器:SerialExecutorThreadPoolExecutor。 AsynkTask 使用不同的执行器,因为默认执行器取决于平台。

      从 DONUT 开始,这已更改为允许多个任务并行运行的线程池。启动 HONEYCOMB,任务恢复到单线程执行,以避免并行执行导致的常见应用程序错误。

      您可以使用function 强制选择执行器在您想要的执行器中执行任务 您可以将AsycTask.SERIAL_EXECUTORAsycTask.THREAD_POOL_EXECUTOR 传递给此函数。之后,您可以根据需要使用它。

      【讨论】:

        【解决方案3】:

        您得到RejectedExecutionException,因为线程池的等待队列已满,您尝试发布另一个任务。你应该从这里开始重构/重新思考你的代码,因为the queue size seems to be 10 加上在大多数情况下应该足够的活动线程。很可能您的某些任务没有完成或长时间运行任务并阻止其他任务或您疯狂地发布线程;)

        Asynctask 有 2 个内置线程池:

        在 SDK > 11 SERIAL_EXECUTOR 是默认值。所以你可以试试THREAD_POOL_EXECUTOR,但要注意,这只能在 SDK => 11 中使用,因为executeOnExecutor 是一种较新的方法。这将解决您的直接问题,但是您可能应该重新考虑是否需要那么多线程。或使用其他方法,例如如果您有许多长时间运行的任务,请提供服务。

        或者,如果您想要自己的 ThreadPool,您可以使用 Executors 创建一个:例如Executors.newCachedThreadPool()(在其他静态构造函数中)。

        【讨论】:

        • 请注意,SERIAL_EXECUTOR 和 THREAD_POOL_EXECUTOR 使用完全相同的多线程执行器。串行执行器只是在它前面有一个出队,以便任务串行执行。
        猜你喜欢
        • 2012-01-25
        • 2012-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-05
        • 2016-01-01
        • 2023-03-09
        • 2021-12-01
        相关资源
        最近更新 更多