美文网首页
线程池 参数理解

线程池 参数理解

作者: Cliper | 来源:发表于2021-07-10 17:03 被阅读0次

    线程池的的作用归根结底就是避免重复创建线程 带来的性能开销。
    下面来看看线程池的参数 所代表的意义,已经在线程池启动时所起到的作用。
    public ThreadPoolExecutor(int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue,
    ThreadFactory threadFactory,
    RejectedExecutionHandler handler) 。

    corePoolSize :

    核心线程大小。
    主要作用是减少线程的创建时间和销毁时间。
    假设现在corePoolSize设置为 3 ,刚开始工作线程数量为 == 0 ,来了一个任务那么corePoolSize == 1,第一个任务执行完毕,又来了一个线程还是会继续创建线程 去执行任务 而不是交给第一个线程执行,直到创建线程数量 为3。

    maximumPoolSize:

    最大线程数 。
    假设maximumPoolSize设置为5,maximumPoolSize一定是要大于corePoolSize ,比如任务太多3个线程都还在工作,那么会继续创建线程最多再创建2个额外线程。

    keepAliveTime

    额外线程存活时间。
    当创建的两个额外线程执行完任务后,等到设定的时间就会被回收 释放。

    workQueue

    工作队列。
    用于什么场景呢?还是上面的场景。如果任务实在太多了,3个核心线程,2个额外线程 都还在执行任务,现在源源不断还来了很多任务,那么就会被加入到工作队列里面等待被执行。如果一下子分配了太多的任务工作队列会出现OOM ,为啥呢?因为使用了无界队列 有多少任务塞多少任务就 任务居多 就会出现OOM。那么怎么解决呢?采用有界队列 当workQueue达到预期值时就不要再塞任务了。

    threadFactory

    线程工厂。
    顾名思义就是创建线程的工厂

    RejectedExecutionHandler

    拒绝策略。
    啥时候会触发呢?比方说上面的场景任务巨多,还在给我安排任务,那么就会抛出 此异常 RejectedExecutionException。让其它线程去处理。
    线程池提供了 AbortPolicy,DiscardPolicy,DiscardOldestPolicy,CallerRunsPolicy,自定义这五种拒绝策略,默认是 AbortPolicy。

    相关文章

      网友评论

          本文标题:线程池 参数理解

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