记录一下学习历程。
这里以Application类为例。
我们有三个耗时启动操作,如果将它放置在Oncreate中,那无疑是会增加我们的启动时间,原因是假如设备为四核,那可能分配给我们的就只有两个,相当于是本来有四个人可以工作,但是现在有两人干了四个人的活,因此会增加时间成本,同时对CPU的利用率也不高。
那此时我们可以通过线程池来进行提升效率(ExecutorService),关于ExecutorService原理等内容可自行百度,这里只做用法参考和效率展示。
package com.tanbo.rocery_store;
import android.content.Context;
import android.os.AsyncTask;
import android.support.multidex.MultiDex;
import android.support.multidex.MultiDexApplication;
import com.myi.tools.TBTools;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class APPAplication extends MultiDexApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
//这里的代码是拿的AsyncTask的源码,作用是创建合理可用的线程池容量
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));
private ExecutorService executorService;
@Override
public void onCreate() {
super.onCreate();
TBTools.init(this);
TBTools.openToolsLog(true);
long startTime = System.currentTimeMillis();
executorService = Executors.newFixedThreadPool(CORE_POOL_SIZE);
executorService.execute(new Runnable() {
@Override
public void run() {
test1();
TBTools.log().i("task","test1 over");
}
});
executorService.execute(new Runnable() {
@Override
public void run() {
test2();
TBTools.log().i("task","test2 over");
}
});
executorService.execute(new Runnable() {
@Override
public void run() {
test3();
TBTools.log().i("task","test3 over");
}
});
TBTools.log().i("StartTime","Application oncreate end >>>"+(System.currentTimeMillis()-startTime));
}
public void test1(){
for (int i = 0; i <10000000 ; i++) {
}
}
public void test2(){
for (int i = 0; i <10000000 ; i++) {
}
}
public void test3(){
for (int i = 0; i <10000000 ; i++) {
}
}
}
代码中,我们创建了一个线程池,然后分别执行了三个耗时方法,运行结果:
再贴个未使用线程池的运行运行结果:
可见差距有多大,当然如此大的耗时操作,在编写代码之处我们就会使用子线程来操作,但是管理的问题就会油然而生,但是为什么这里不用new Thread直接干,原因可谷歌百度。
假如启动过程中存在依赖关系,比如必须test3执行完才进行下一步,则可使用CountDownLatch来进行等待。
这里看出通过线程池,我们将启动操作进行优化,缩短了启动时间,这个过程中,我们也可以通过Systrace等监测工具去观察CPU的使用情况,基本上是在合理范围之内,这里就不去进行此展示。
-------------------------------------------------------------------------------------------------------------------------------------------------
以上是线程池的操作,当然还有更优的解决方案:https://blog.csdn.net/Hello___Sunshine/article/details/93716138
酌情进行选择!!!