AsyncTaks 的受控执行

Controlled execution of AsyncTaks

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

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

但是,碰巧数据量很大,因此 运行 在实际 Android 设备上进行此操作会使应用程序崩溃,因为线程过多并出现 RejectedExecutionException。此外,还有一个 UI 表单,用户可以通过该表单提供数据并手动调用相同的 SomeAsyncDataTask AsyncTask class。

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

您应该为此目的使用 ExecutorService。

ExecutorService 执行器服务 = Executors.newFixedThreadPool(5);

new MyAsyncTask().executeOnExecutor(executorService);