• 简单纪要:线程池的使用


    ThreadPoolExecutor类

      public ThreadPoolExecutor(int corePoolSize,    
                                  int maximumPoolSize, 
                                  long keepAliveTime,
                                  TimeUnit unit,
                                  BlockingQueue<Runnable> workQueue) {
            this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
                 Executors.defaultThreadFactory(), defaultHandler);
        }
    corePoolSize:核心线程数:核心线程会一直存活,即使不存在任务,并核心线程数不能为0,非则抛出异常(IllegalArgumentException);
    maximumPoolSize:线程最大数:线程池所能创造最大个数,
    a, 当前线程数 >= 核心核心线程数 创造新线程继续执行;
    b, 当前线程数 = 线程最大数 抛出异常,拒绝处理任务;
    keepAliveTime:线程空闲时间  当线程空闲时间达到 keepAliveTime时间时,当前线程会被杀死,直到达到核心线程数;
    workQueue:线程池所使用的缓冲队列;
    ThreadFactory:线程工厂,用于创建线程;
    RejectedExecctionHandle:拒绝策略;


    当核心线程数满了,阻塞队列也满了,此时
    maximumPoolSize 扩容,如果maximumPoolSize 也满了,就会启动阻塞机制;

    生产中常用的线程池配置

    配置分为两类:

    cpu密集型:本地CPU核数 + 1 

    io   密集型:本地CPU核数 * 2

    手动配置:

    本地cpu核数  / 1 - 阻塞系数  (阻塞系数在 0.8 - 0.9 之间)

    常见四种线程池

    1) fixthreadPool: 固定数目线程池,正规的开发线程,多用于服务器,核心线程是没有超时机制的,队列没有大小,除非线程关闭了,核心线程才会被回收;

    2)cacheThreadPool:只有非核心线程,最大线程数很大,他会为每一个任务添加一个线程,但是有超时时间,如果线程空闲时间 > 60s,会被回收;

    3)singleThreadPool: 只有一个核心线程的线程池;

    4)scheduledThreadPool:是一个有延期执行和周期重复执行的线程池,他的线程池固定,但其他线程随机创建,只要空闲,立即回收;

    但是生产当中,以上四种线程池 很少使用甚至都不使用; 使用的是本文开篇所展示的代码形式;

  • 相关阅读:
    洛谷P1208 [USACO1.3]混合牛奶 Mixing Milk 题解 结构体排序
    信息学竞赛中C语言的输入输出
    Python 关键字参数和可变参数
    大白话讲解神经网络算法,原理如此简单!
    idea debug flink1.12 sqlClient 源码
    Flink SQL如何保证分topic有序
    Flink 1.12.0 SQL Connector支持 Oracle
    Flink实战之Flink SQL connector支持并行度配置
    java程序中执行脚本时具有的是那个用户的权限呢?
    clickhouse日期等函数的使用
  • 原文地址:https://www.cnblogs.com/Rnan/p/10250420.html
Copyright © 2020-2023  润新知