android线程池原理和实现

多线程的管理一直是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
 
  
 
  
 
  

 
  

 
  

你可能感兴趣的:(android,软件开发)