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

一、线程池的作用

创建异步线程的弊端:

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

  

最新文章

  1. libvirt 安装篇
  2. 正则表达式/g与/i及/gi的意义
  3. HTML实体符号代码速查表
  4. java学习:Hibernate入门
  5. 如何做好IT运营.
  6. oracel数据泵的使用
  7. ubuntu下php5扩展mysqli
  8. The first day,I get a blogs!!
  9. 洛谷 P1486 [NOI2004]郁闷的出纳员【Treap】题解+AC代码
  10. Javascript面向对象编程(三):非构造函数的继承
  11. SQL Server中表锁定的原理及解锁演示
  12. java 实现一个beautiful的弹层和具体功能
  13. 在 2016 年学 JavaScript 是一种什么样的体验?(React从入门到放弃)
  14. Java时代即将来临
  15. HTC T329手机如何删除系统自带的软件?HTC一键解锁、获取ROOT权限、豌豆荚删除系统软件
  16. 1111 Online Map (30 分)
  17. pch文件配置
  18. 洛谷 P1350 车的放置
  19. 详谈AngularJS的Directive
  20. PHP 快速建立一个对象

热门文章

  1. 一些实用的GitHub项目
  2. final 和 static之间的区别和联系
  3. HTML5表单验证(4个实用的表单美化案例)
  4. Android布局样式
  5. centos 7 安装 Vue
  6. jQuery笔记(三)jQuery中的事件
  7. 【15】ML项目流程与正交化
  8. [PAT] A1020 Tree Traversals
  9. u盘变成Read-only file system
  10. Pwnable.kr