多线程的管理一直是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 多线程]一些帖子与文章ProgressDialog, AsyncTask, Thr
  2. Android中进程与进程、线程与线程之间如何通信?
  3. Android之Handler非主线程更新UI
  4. Android中的多进程、多线程
  5. Android 高性能编码一:多线程并发或分布式提高TPS
  6. Android Asynchronous Http Client - 开源http 多线程引擎

随机推荐

  1. 3月22日学习记录(2)(显式intent与隐式intent
  2. Android(安卓)WebView 踩过的坑
  3. Android(安卓)3.0 访问WebService或Socke
  4. Android(安卓)监听开机广播实现应用开机
  5. Android(安卓)N 各种ANR的时间
  6. Android(安卓)NavigationView使用详解
  7. Android(安卓)Studio AAPT2 error: check
  8. 基于Android的Word在线预览
  9. Android(安卓)ScrollView 滚动监听
  10. Fragment使用