当前位置: 首页 > 后端技术 > Java

关于Java线程池构造参数,你应该知道这些!

时间:2023-04-01 20:46:39 Java

ThreadPoolExecutor类中有4个构造函数,最终调用的是如下函数:7个参数,如下:corePoolSize线程池中的核心线程数。提交任务时,线程池会创建一个新的线程来执行任务,直到当前线程数等于corePoolSize;如果当前线程数为corePoolSize,则将继续提交的任务保存在阻塞队列中,等待执行;如果执行线程池的prestartAllCoreThreads()方法,线程池会提前创建并启动所有核心线程。当线程数小于等于corePoolSize时,该线程默认会一直存活在线程池中,即使该线程处于空闲状态。如果allowCoreThreadTimeOut设置为true,不管线程数多少,线程空闲一定时间就会被销毁。maximumPoolSize线程池中允许的最大线程数。如果当前阻塞队列已满,继续提交任务,则创建新线程执行任务,前提是当前线程数小于maximumPoolSize;keepAliveTime为线程空闲时的存活时间,即没有任务执行时线程继续存活的时间;默认情况下,这个参数只有在线程数大于corePoolSize时才有用;如果allowCoreThreadTimeOut设置为true,不管线程数多少,线程空闲一定时间就会被销毁。unitkeepAliveTime的单位。TimeUnit是枚举类型,包括:NANOSECONDS:1微秒=1微秒/1000MICROSECONDS:1微秒=1毫秒/1000MILLISECONDS:1毫秒=1秒/1000SECONDS:秒MINUTES:分钟HOURS:小时DAYS:天workQueue使用的阻塞队列保存等待执行的任务,任务必须实现Runable接口,如下:ArrayBlockingQueue:基于数组结构的有界阻塞队列,按照先进先出的方式对任务进行排序;LinkedBlockingQuene:基于链表结构的无界阻塞队列,通过FIFO排序任务,吞吐量通常高于ArrayBlockingQuene;SynchronousQuene:不存储元素的阻塞队列,每次插入操作必须等到另一个线程调用移除操作,否则插入操作一直阻塞,吞吐量通常高于LinkedBlockingQuene;threadFactory为线程创建一个工厂。通过自定义线程工厂,可以为每个新创建的线程设置一个可识别的线程名称,例如:publicclassOneMoreThreadFactoryimplementsThreadFactory{privatestaticfinalAtomicIntegerpoolNumber=newAtomicInteger(1);privatefinalAtomicIntegerthreadNumber=newAtomicInteger(1);私有最终字符串名称前缀;publicOneMoreThreadFactory(){namePrefix="OneMoreThread-"+poolNumber.getAndIncrement()+"-";}@OverridepublicThreadnewThread(Runnabler){returnnewThread(r,namePrefix+threadNumber.getAndIncrement());}}handler线程池的饱和策略。当阻塞队列已满,没有空闲的工作线程时,如果继续提交任务,就必须采取一种策略来处理任务。线程池提供了4种策略:AbortPolicy:直接抛出异常,默认策略;CallerRunsPolicy:使用调用者所在线程执行任务;DiscardOldestPolicy:丢弃阻塞队列中的栈顶任务,执行当前任务;DiscardPolicy:直接丢弃任务;