在Android AsyncTask类的doInBackground()函数中运行多线程代码会有性能优势吗?这是我计划的草图:
private class MyBackgroundTask extends AsyncTask<Integer, Integer, Integer>
{
protected Integer doInBackground(Integer... vals)
{
Thread[] thrds = new Thread[NUM_THREADS];
//Start all threads
for(int i = 0; i < thrds.length; ++i)
{
thrds[i] = //Initialize threads
thrds[i].start();
}
//Wait for all threads to finish
for(int i = 0; i < thrds.length; ++i)
thrds[i].join();
//Post processing...
return foo;
}
protected void onPostExecute(Integer res)
{
//Pass value back to UI class
}
}
这会产生可以在多核设备上利用的新线程吗?例如,如果线程每个都搜索(非常大)的数组以获得最大值,那么多核设备的性能是否会提高?或者这会导致类似“多对一”的行为.
还有一件事,我想使用Threads多线程而不是调用多个AsyncTasks,因为多线程最终将处理域级处理.我非常希望将域级别处理与UI类分离,以便我可以将域级别类重用于不同的UI.
提前致谢.
解决方法:
您应该使用AsyncTask,使用Thread#start()生成自己的线程,或者使用java.util.concurrent.Executor.你不太可能想要结合这些东西.
默认情况下,AsyncTask类为您的进程提供一个与UI线程不同的线程.其原因主要是确保任务始终按照启动顺序完成.如果这对您来说不是问题,那么AsyncTask允许您指定要运行的任何其他Executor,并提供一个已调整为具有针对目标处理器上的核心数调整的理想大小池的优秀库.
像这样运行一系列任务:
AsyncTask[] tasks = ...
for (Task task : tasks) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
}
好奇的是,Android平台内的代码如下所示:
private static final int cpu_COUNT = Runtime.getRuntime().availableProcessors();
private static final int CORE_POOL_SIZE = cpu_COUNT + 1;
private static final int MAXIMUM_POOL_SIZE = cpu_COUNT * 2 + 1;
private static final int KEEP_ALIVE = 1;
/**
* An {@link Executor} that can be used to execute tasks in parallel.
*/
public static final Executor THREAD_POOL_EXECUTOR
= new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);