多线程的管理一直是android开发的一项核心技术,合理的利用线程池管理线程可以大大提高app的性能,下面我们来看看在android中线程池的使用
关于线程池的理解,概念性的东西本文就不再阐述,不理解的地方可以私信,
在android中,管理线程池主要用到了java.util.concurrent.ThreadPoolExecutor这个类,该类的官方文档(有墙)。该类的父类是ExecutorService,
该类中有几个重要的参数概念:
1 :Core and maximum pool sizes: 其中Core指的是该线程池被创建时,线程池中线程的个数,maximum 指的是线程池中最大线程个数,这两个是有区别的,区别在于Core是线程池正常工作时候线程池的个数,maximum 指的是线程池在高负荷(线程池任务排满)的情况下,线程池的线程数.
2 Keep-alive times 顾名思义,该参数指的是线程池在空闲的时候存在的时间,当线程池空闲时,并不需要马上销毁,而是把线程池挂起来,这样就能减少CPU和内存创建线程池的消耗.
3 Queuing :当线程池的任务比较多时,线程池就会把一些任务放在一个队列中进行排队等待.
说了那么多概念,接下来就来写一段代码吧,首先创建一个单例线程池管理类管理线程池
ThreadManager.class,该类中有一个内部类用来创建线程池ThreadPoolProxy.class
重写该类的构造方法:
public ThreadPoolProxy(int corePoolSize,int maxcorePoolSize,long time ){ this.corePoolSize=corePoolSize; this.maxcorePoolSize=maxcorePoolSize; this.time=time; }其中,corePoolSize指的是线程池线程个数,maxcorePoolSize指的是最大线程数,time指的是存活时间,单位ms在该类中写一个execute方法:
public void execute(Runnable runnable){ if (pool==null){ //创建一个线程池 pool=new ThreadPoolExecutor(corePoolSize,maxcorePoolSize ,time, TimeUnit.MINUTES,new LinkedBlockingDeque<Runnable>(10)); } pool.execute(runnable); }
其中pool是ThreadPoolExecutor对象,在创建对象时将corePoolSize(线程数),maxcorePoolSize(最大线程数)
time(存活时间),TimeUnit.MINUTES(时间单位),new LinkedBlockingDeque<Runnable>(10)(排队等待执行任务的队列,最大为10个任务);
pool.execute(runnable);执行任务
有创建当然就有取消了:public void cance(Runnable runnable){ if (pool!=null&&!pool.isShutdown()&&!pool.isTerminated()){ //判断线程池是否为空,线程池是否崩溃,是否已经停止 pool.remove(runnable); } }在ThreadPoolProxy类中初始化ThreadPoolProxy内部类:
public synchr,onized ThreadPoolProxy creatCPUPool(){ int cpus=Runtime.getRuntime().availableProcessors(); Log.e("TAG","设备cpu数为:"+String.valueOf(cpus)); int threadnumber=2*cpus+1; Log.e("TAG","最佳线程数为:"+String.valueOf(threadnumber)); if (threadCPUPoolProxy==null){ threadCPUPoolProxy=new ThreadPoolProxy(threadnumber,threadnumber,6000L); } return threadCPUPoolProxy; }注意,ThreadPoolProxy并不需要重复创建,过多创建线程池容易发生资源泄露,因此我们只需要创建一次,线程池的线程数理论上应该满足2*CPU核心数+1的时候性能最佳。
最后,只需要在要使用到多线程的地方这么做就行
ThreadManager.getInstance().creatCPUPool().execute(new Runnable() { @Override public void run() { //要执行的内容 } });
工具类地址:http://download.csdn.net/detail/qq_25817651/9600788