首页 > 编程语言 >Java线程池参数详解及其示例

Java线程池参数详解及其示例

时间:2024-03-14 11:30:59浏览次数:31  
标签:Java 示例 队列 keepAliveTime maximumPoolSize corePoolSize 任务 线程

线程池在Java并发编程中占据核心地位,通过复用线程资源,可以极大地提高系统资源利用率和响应速度。Java中的java.util.concurrent.ThreadPoolExecutor类提供了丰富的参数配置以满足不同场景的需求。下面我们将逐一介绍线程池的主要构建参数,并给出相应的例子说明:

1. corePoolSize:核心线程数

corePoolSize决定了线程池的基本规模,即线程池即使在没有任务执行时也会保有的线程数量。这些线程始终存活在线程池中,除非设置了允许它们超时关闭的策略。

int corePoolSize = 5; // 设置线程池核心线程数为5

2. maximumPoolSize:最大线程数

maximumPoolSize限制了线程池能够容纳的最大线程数。当线程池中活跃线程数超过corePoolSize,且任务队列已满时,线程池会创建新的线程来处理任务,直到达到maximumPoolSize为止。

int maximumPoolSize = 10; // 设置线程池最大线程数为10

3. keepAliveTime:存活时间

keepAliveTime参数指定了线程在没有任务执行时可以保持空闲状态的最大时间。如果超过了这个时间,且线程池中的线程数大于corePoolSize,那么超出部分的空闲线程将会被终止。

long keepAliveTime = 60L; // 设置空闲线程存活时间为60秒

4. unit:时间单位

keepAliveTime配套使用,用来指定存活时间的单位,可以是TimeUnit.MILLISECONDSTimeUnit.SECONDSTimeUnit.MINUTES等七种预定义的时间单位之一。

TimeUnit unit = TimeUnit.SECONDS; // 设置存活时间单位为秒

5. workQueue:任务队列

这是一个阻塞队列,用于存储等待执行的任务。常见的选择有LinkedBlockingQueueArrayBlockingQueueSynchronousQueue等。线程池会按照队列策略决定何时创建新线程或拒绝任务。

BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(10); // 创建一个容量为10的任务队列

6. threadFactory:线程工厂

用于创建新线程的工厂类,可以根据需要定制线程的名称、优先级、是否守护线程等属性。默认情况下,线程工厂创建的线程是正常优先级、非守护线程。

ThreadFactory threadFactory = Executors.defaultThreadFactory(); // 使用默认线程工厂
// 或者自定义线程工厂
ThreadFactory customFactory = r -> {
    Thread t = new Thread(r);
    t.setName("CustomThread");
    t.setDaemon(true);
    return t;
};

7. handler:拒绝策略

当线程池无法接受新提交的任务时(例如线程池已关闭,或者队列已满且线程数达到maximumPoolSize),则需要采用一种拒绝策略来处理新任务。Java中有四种预定义的拒绝策略:

  • AbortPolicy(默认):直接抛出RejectedExecutionException异常。
  • CallerRunsPolicy:调用者所在的线程执行任务。
  • DiscardPolicy:默默丢弃任务。
  • DiscardOldestPolicy:丢弃队列中最旧的任务(即将最早进入队列但还未被执行的任务),尝试提交当前任务。
RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy(); // 使用默认的拒绝策略
// 或者自定义拒绝策略
RejectedExecutionHandler customHandler = (r, executor) -> System.out.println("Task " + r + " is rejected by the pool.");

结合以上参数,我们可以创建一个完整的线程池实例:

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    corePoolSize,
    maximumPoolSize,
    keepAliveTime,
    unit,
    workQueue,
    threadFactory,
    handler
);

这样就完成了一个可以根据业务需求灵活配置的线程池。在实际应用中,根据任务特性合理设置这些参数可以极大提升系统的并发处理能力和资源利用率。

标签:Java,示例,队列,keepAliveTime,maximumPoolSize,corePoolSize,任务,线程
From: https://blog.csdn.net/qq_29752857/article/details/136703276

相关文章

  • 【Javascript】 Promise 对象(二)
    Promise.all()Promise.all()方法用于将多个Promise实例,包装成一个新的Promise实例。constp=Promise.all([p1,p2,p3]);上面代码中,Promise.all()方法接受一个数组作为参数,p1、p2、p3都是Promise实例,如果不是,就会先调用下面讲到的Promise.resolve方法,将参数转为Pr......
  • 【JavaScript】闭包
    闭包的引入我们知道,变量根据作用域的不同分为两种:全局变量和局部变量。函数内部可以访问全局变量和局部变量。函数外部只能访问全局变量,不能访问局部变量。当函数执行完毕,本作用域内的局部变量会销毁。比如下面这样的代码:functionfoo(){leta=1;}foo(......
  • 多线程系列(十九) -Future使用详解
    一、摘要在前几篇线程系列文章中,我们介绍了线程池的相关技术,任务执行类只需要实现Runnable接口,然后交给线程池,就可以轻松的实现异步执行多个任务的目标,提升程序的执行效率,比如如下异步执行任务下载。//创建一个线程池ExecutorServiceexecutor=Executors.newFixedThreadPool......
  • 关于java.net.URLEncoder.encode()将空格转成+问题
    1.情景展示如上图所示,当我们使用jdk自带的类对数据进行URL编码时,空格会被转成+。这其实是不对的,我们知道:空格对应url编码是:%20,所以,jdk自带的URLEncoder将空格转成+是不对的。如何解决?2.解决方案既然jdk自带的URLEncoder有问题,我们就有两种解决办法。一种是仍然使用它,然......
  • 风控规则引擎(一):Java 动态脚本
    风控规则引擎(一):Java动态脚本日常场景共享单车会根据微信分或者芝麻分来判断是否交押金汽车租赁公司也会根据微信分或者芝麻分来判断是否交押金在一些外卖APP都会提供根据你的信用等级来发放贷款产品金融APP中会根据很复杂规则来判断用户是否有借款资格,以及贷款金额。......
  • 阿里一面:Java中如何停止线程?
    引言在Java多线程编程中,正确且安全地停止线程是一项关键技能。简单粗暴地“杀死”线程不仅可能导致数据不一致性,还可能引发各种难以预测的错误。本文将探讨几种在Java中优雅地停止线程的方法,以确保程序的健壮性和可靠性。使用标志位(共享变量)停止线程一种常见的做法是使用一个bo......
  • 「Java开发指南」MyEclipse如何支持Spring Scaffolding?(五)
    在上文中(点击这里回顾>>)主要为大家介绍了SpringDSL模型等内容,本文将继续介绍菜单等。MyEclipsev2023.1.2离线版下载MyEclipse技术交流群:742336981欢迎一起进群讨论6.菜单本节主要描述与Spring支持的MyEclipse相关的各种菜单。6.1MyEclipse菜单当您右键单击Eclipse项目......
  • 面试了一个 5 年 Java 程序员,一个问题也不会。。
    大家好,我是R哥。周末愉快呀,最近我在做Java面试辅导,也模拟面试了好些个学员,说说其中一个学员吧,一个工作5年的Java程序员,模拟面试,居然一个问题也不会。。当晚模拟面试完,我的心情很复杂。我之前做系统架构师,同时也是面试官,这些年,少说也面试过几百上千人,不乏知识渊博、技能顶......
  • 【JavaScript】面试手撕柯里化函数
    ......
  • 图解Java并发编程第一章总结【精炼版】
    【第一章】图解Java并发编程Java线程的基本操作yield操作:yield操作,在基于时间片轮转的cpu调度算法中,用来放弃当前时间片sleep操作:sleep操作分为三种情况普通sleep:在指定时间内放弃cpu使用权,不释放同步锁sleep(0):作用与yield相同sleep被中断:抛出中断异常......