• 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的集合来维护顺序的。

      

  • 相关阅读:
    java_000.JAVA语言课堂测试试卷01
    2018暑假第八周总结&暑假代码成果总结(8.27-9.2)
    C#_最基础的计算器
    Java_学生信息管理系统——数组版——初次编写
    Java_计算器001,支持加减乘除,括号,小数点,√,^ 运算
    Java_计算器001,支持加减乘除,括号运算
    2018暑假第七周总结(8.20-8.26)
    2018暑假第六周总结(8.13-8.19)
    2018暑假第五周总结(8.6-8.12)
    poj 1984(带权并查集)
  • 原文地址:https://www.cnblogs.com/farmerkids/p/5584772.html
Copyright © 2020-2023  润新知