zoukankan      html  css  js  c++  java
  • 线程池(二)

     

    功能线程池

    嫌上面使用线程池的方法太麻烦?其实Executors已经为我们封装好了4种常见的功能线程池,如下:

    • 定长线程池(FixedThreadPool)
    • 定时线程池(ScheduledThreadPool )
    • 可缓存线程池(CachedThreadPool)
    • 单线程化线程池(SingleThreadExecutor)

    1定长线程池(FixedThreadPool)

    创建方法的源码:

     

    • 特点:只有核心线程,线程数量固定,执行完立即回收,任务队列为链表结构的有界队列。
    • 应用场景:控制线程最大并发数。

    使用示例:

     

    2定时线程池(ScheduledThreadPool )

    创建方法的源码:

     

    • 特点:核心线程数量固定,非核心线程数量无限,执行完闲置10ms后回收,任务队列为延时阻塞队列。
    • 应用场景:执行定时或周期性的任务。

    使用示例:

     

    3.可缓存线程池(CachedThreadPool)

    创建方法的源码:

     

    •  特点:无核心线程,非核心线程数量无限,执行完闲置60s后回收,任务队列为不存储元素的阻塞队列。
    •  应用场景:执行大量、耗时少的任务。

    使用示例:

     

    4.单线程化线程池(SingleThreadExecutor)

    创建方法的源码:

     

    • 特点:只有1个核心线程,无非核心线程,执行完立即回收,任务队列为链表结构的有界队列。
    • 应用场景:不适合并发但可能引起IO阻塞性及影响UI线程响应的操作,如数据库操作、文件操作等。

    使用示例:

     

    5.对比

     

     6总结

    Executors的4个功能线程池虽然方便,但现在已经不建议使用了,而是建议直接通过使用ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

    其实Executors的4个功能线程有如下弊端:

    •  FixedThreadPool和SingleThreadExecutor:主要问题是堆积的请求处理队列均采用LinkedBlockingQueue,可能会耗费非常大的内存,甚至OOM。
    •  CachedThreadPool和ScheduledThreadPool:主要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。
  • 相关阅读:
    MySQL存储过程中的3种循环【转载】
    单元样选择按钮
    JavaScript(jQuery)实现打印英文格式日期
    哈希算法
    Hello,Expression Blend 4 (含Demo教程和源码)
    Cocos2Dx for XNA类解析(2): CCDirector(上)
    github for Windows使用介绍
    Hello,Behavior
    Vue component+vuedraggable拖拽动态表单
    Vue Component
  • 原文地址:https://www.cnblogs.com/xs-yqz/p/13366686.html
Copyright © 2011-2022 走看看