0

我有一个创建多个 AsyncTasks 的 for 循环。大量data存在的数组和 for 循环处理每个数据并使用该数据调用执行程序。AsyncTask 对该数据进行了一些密集处理,并且此代码对于小型数据集非常有效,即数据数组足够小,不会创建太多线程。

for(Data datum: data)
{
    new SomeAsyncDataTask(datum, this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}

然而,碰巧数据量很大,因此在生产环境中运行,即在实际的 Android 设备上运行,应用程序由于线程过多而导致 RejectedExecutionException 崩溃。此外,还有一个 UI 表单,用户可以通过该表单提供数据并手动调用相同的 SomeAsyncDataTaskAsyncTask类。

我正在寻找一种解决方案,通过该解决方案我可以通过限制一次运行 5 个 AsyncTask 来控制此执行,并且必须将任何其他任务排队。此外,当用户发送任务时,如果队列有任何未运行的排队任务,我更愿意将此用户任务放在顶部,以便当正在运行的任务完成时,此任务有机会运行而其他任务仅出现之后。谷歌搜索显示了一些结果;就像有一个叫做 PriorityBlockingQueue 的东西,但是看着代码让我很困惑。这是一个解决方案吗?如果是这样,如何在这种情况下使用它(对于上面的代码)。请提出解决方案-谢谢!

4

1 回答 1

2

为此,您应该使用 ExecutorService。

ExecutorService executorService = Executors.newFixedThreadPool(5);

新的 MyAsyncTask().executeOnExecutor(executorService);

于 2015-10-14T15:25:08.023 回答