多线程的管理一直是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(10));    }    pool.execute(runnable);}

其中pool是ThreadPoolExecutor对象,在创建对象时将corePoolSize(线程数),maxcorePoolSize(最大线程数)
time(存活时间),TimeUnit.MINUTES(时间单位),new LinkedBlockingDeque(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
   
   
   

   

   

更多相关文章

  1. 浅析Android中的消息机制-解决:Only the original thread that cr
  2. Android之菜单总结
  3. Android异步消息机制之Handler
  4. Android的Handler机制详解3_Looper.looper()不会卡死主线程
  5. Android使用Retrofit进行网络请求
  6. Android官方入门文档[1]创建一个Android项目
  7. android 创建桌面快捷方式 、插件
  8. AIR Native Extension的使用(Android)一 : 打包ane
  9. Android(安卓)之 AsyncTask 异步任务

随机推荐

  1. BroadcastReciver 广播接收者---DAY06 20
  2. imageButton被边框包围的原因、解决办法
  3. android webview 设置背景透明色
  4. Android移植到Asus P535步骤说明
  5. Android(安卓)Handler消息机制(源码分析)
  6. Android设置权限问题
  7. Android开机广播和关机广播
  8. Android中Handler Runnable与Thread的区
  9. 教你配置安卓开发环境!(附带开发通讯教程)
  10. Android-缓存数据保存-通用方法