Android 开发 ThreadPool(线程池) 总结

Posted 农民子弟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 开发 ThreadPool(线程池) 总结相关的知识,希望对你有一定的参考价值。

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

首先介绍一个方法,获取CPU个数:

  int cpuCount = Runtime.getRuntime().availableProcessors();

一、创建异步线程的弊端。

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

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

二、启用线程池的优点。

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

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

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

三、ExecutorService 线程池

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

1、newCachedThreadPoll

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

  

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同步线程池

 

  注意:

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

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

 

以上是关于Android 开发 ThreadPool(线程池) 总结的主要内容,如果未能解决你的问题,请参考以下文章

java核心知识点 --- 线程池ThreadPool

C#多线程编程:线程池ThreadPool

Android ThreadPool 类扩展应用

多线程之旅(ThreadPool 线程池)

线程池ThreadPool及Task调度机制分析

C#多线程--线程池(ThreadPool)