java – AsyncTask doInBackground中的多线程代码

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);

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...