ExecutorService 详解

作者: 三斤牛肉 | 来源:发表于2017-06-16 15:23 被阅读172次

    ThreadPoolExecutor

    主要参数:

    • corePoolSize

    线程池核心大小,当从没有任务到新任务进入时线程从0上涨到coreSize

    • maximumPoolSize

    线程池queue满后新建线程到maxSize为止

    • keepAliveTime

    线程无工作后开始计时,如果时间大于keepAliveTime并且总线程数大于coreSize则被回收

    • BlockingQueue<Runnable> workQueue

    工作队列,由用户自定义,不同的QUEUE代表了不同的处理方式

    • ThreadFactory

    线程工厂,一般用默认的

    • RejectedExecutionHandler

    当队列满,线程池满后的异常状况处理,默认抛rejectexecutionException

    核心代码:

    image.png

    中间这步比较特殊,是当前工作线程为空,但是还有任务在队列中则新建一个线程。

    常用:

    FixedThreadPool

    特点

    • corePoolSize=maximumPoolSize
    • 使用LinkedBlockingQueue 无界,缓冲队列
    • 无等待(idel)时间,如果队列为空立即返回
    • 数目固定的线程池,当到达coresize后不会销毁,一直等待

    使用问题:

    固定的线程数,无界的Queue,当有大量任务时,queue过长可能导致oom

    CachedThreadPool

    特点

    • 最小线程数0,最大线程数Integer.MAX
    • 使用SynchronousQueue 无界 无缓冲 等待队列
    • 元素添加后必须等待其被取出才能继续放入(可以认为缓存值为1的阻塞队列)
    • 当某个线程60秒未被使用则移除,(图一中workQueue.poll等待60秒,超时返回null,则图2中的循环退出,相应worker结束

    使用问题:

    当前面线程没有结束时,会一直创建新线程一直到Integer.MAX,然后queue进入等待,
    一般会直接导致线程不够用
    线程池伸缩会很厉害,极限范围0—Integer.MAX
    适用于快速失败的情况

    相关文章

      网友评论

        本文标题:ExecutorService 详解

        本文链接:https://www.haomeiwen.com/subject/mjcmqxtx.html