Android 开发 ThreadPool(线程池) 总结

本文是介绍线程池的基础篇。

一、线程池的作用 

创建异步线程的弊端:

  1、每次new Thread创建对象,导致性能变差。

  2、缺乏统一的管理,可能导致无限制的线程运行,严重的后果就是OOM 或者死机。

使用线程池的有点:

  1、重用性大,减少对象的创建,提高性能。

  2、可有效控制并发线程数,提高系统资源利用率,避免资源争夺。

  3、可提供多种功能:定时、循环、并发、单一等功能。

三、ExecutorService 线程池

  Java通过Executors提供了四类常用的线程池。  

1、newCachedThreadPoll

  定义一个线程池,当线程池里面有可复用的线程,重用线程执行,如果没有,新建线程执行。线程池容量可以无线大。

  ExecutorService cacheThread = Executors.newCachedThreadPool();
        for (int i = 0; i < 100; i++) {
            cacheThread.execute(new Runnable() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub                   
                }
            });
        }

2、newSingleThreadExecutor

  创建一个线程池,只有唯一的一个活动的工作线程,有序(FIFO,LIFO,优先级等顺序)的处理队列中的任务。

  ExecutorService singleExecutor = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 100; i++) {
            singleExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    
                }
            });
        }  

3、newFixedThreadPool

  定义一个可用并发数的线程池,超过并发数的线程,在队列里面等待。

  ExecutorService fixedThread = Executors.newFixedThreadPool(3);
        for(int i = 0; i < 100 ; i ++){
            fixedThread.execute(new Runnable() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    
                }
            });
        }  

4、newScheduledThreadPool

  创建一个定长线程池,支持定时及周期性任务执行。

  ScheduledExecutorService scheduledThread = Executors.newScheduledThreadPool(3);
        //延时执行
        scheduledThread.schedule(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                
            }
        }, 2*1000, TimeUnit.SECONDS);
        //固定的间隔执行,不受任何影响
        scheduledThread.scheduleAtFixedRate(new Runnable() {
            
            @Override
            public void run() {
                // TODO Auto-generated method stub
                
            }
        }, 10*1000, 1*1000, TimeUnit.SECONDS);
        //当线程执行完毕后的,开始计算时间间隔再次执行
        scheduledThread.scheduleWithFixedDelay(new Runnable() {            
            @Override
            public void run() {
                // TODO Auto-generated method stub
                
            }
        }, 10*1000, 1*1000, TimeUnit.SECONDS);

  

四、AnsyncTask异步线程

  提供两个线程池:

  1、THREAD_POOL_EXECUTOR异步线程池    

  2、SERIAL_EXECUTOR同步线程池

  使用方式:

  new AsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, 0);

  注意:

  1、当默认使用AsyncTask.execute()执行异步任务,默认使用SERIAL_EXECUTOR.

  2、SERIAL_EXECUTOR是在THREAD_POOL_EXECUTOR基础上,加一个task的集合来维护顺序的。

 

  

 

posted @ 2016-06-14 17:25  农民子弟  阅读(878)  评论(0编辑  收藏  举报