线程池的核心参数和执行流程

简介: 本章主要讲解了线程池的核心参数和执行流程

1、为什么使用线程池?

  • 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  • 提高响应速度。当任务到达时,可以不需要等到线程创建就能立即执行。
  • 提高线程的可管理性。统一管理线程,避免系统创建大量同类线程而导致消耗完内存。

2、线程池执行原理?

1. 当线程池里存活的线程数小于核心线程数 corePoolSize 时,这时对于一个新提交的任务,线程池会创建一个线程去处理任务。当线程池里面存活的线程数小于等于核心线程数 corePoolSize 时,线程池里面的线程会一直存活着,就算空闲时间超过了 keepAliveTime ,线程也不会被销毁,而是一直阻塞在那里一直等待任务队列的任务来执行。

2. 当线程池里面存活的线程数已经等于corePoolSize了,这是对于一个新提交的任务,会被放进任务队列workQueue排队等待执行。

3. 当线程池里面存活的线程数已经等于 corePoolSize 了,并且任务队列也满了,假设maximumPoolSize>corePoolSize ,这时如果再来新的任务,线程池就会继续创建新的线程来处理新的任务,知道线程数达到 maximumPoolSize ,就不会再创建了。

4. 如果当前的线程数达到了 maximumPoolSize ,并且任务队列也满了,如果还有新的任务过来,那就直接采用拒绝策略进行处理。默认的拒绝策略是抛出一个RejectedExecutionException异常。

3、线程池的核心参数

publicThreadPoolExecutor(intcorePoolSize, intmaximumPoolSize, longkeepAliveTime, TimeUnitunit, BlockingQueue<Runnable>workQueue, ThreadFactorythreadFactory, RejectedExecutionHandlerhandler);

1、 corePoolSize :当有新任务时,如果线程池中线程数没有达到线程池的基本大小,则会创建新的线

程执行任务,否则将任务放入阻塞队列。当线程池中存活的线程数总是大于 corePoolSize 时,应该考虑

调大 corePoolSize

2maximumPoolSize :当阻塞队列填满时,如果线程池中线程数没有超过最大线程数,则会创建新的

线程运行任务。否则根据拒绝策略处理新任务。非核心线程类似于临时借来的资源,这些线程在空闲时

间超过 keepAliveTime 之后,就应该退出,避免资源浪费。

3BlockingQueue :存储等待运行的任务。

4keepAliveTime 非核心线程空闲后,保持存活的时间,此参数只对非核心线程有效。设置为0

表示多余的空闲线程会被立即终止。

5TimeUnit :时间单位

6ThreadFactory :每当线程池创建一个新的线程时,都是通过线程工厂方法来完成的。在

ThreadFactory 中只定义了一个方法 newThread,每当线程池需要创建新线程就会调用它。

7RejectedExecutionHandler :当队列和线程池都满了的时候,根据拒绝策略处理新任务。

4、拒绝策略有哪些

  • AbortPolicy:默认的策略,直接抛出RejectedExecutionException
  • DiscardPolicy:不处理,直接丢弃
  • DiscardOldestPolicy:将等待队列队首的任务丢弃,并执行当前任务
  • CallerRunsPolicy:由调用线程处理该任务
相关文章
|
5月前
|
Java
解析Java线程池:参数详解与执行流程
解析Java线程池:参数详解与执行流程
59 1
|
4月前
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
45 0
|
2月前
|
消息中间件 存储 前端开发
面试官:说说停止线程池的执行流程?
面试官:说说停止线程池的执行流程?
51 2
面试官:说说停止线程池的执行流程?
|
1月前
|
设计模式 Java 物联网
【多线程-从零开始-玖】内核态,用户态,线程池的参数、使用方法详解
【多线程-从零开始-玖】内核态,用户态,线程池的参数、使用方法详解
58 0
|
3月前
|
缓存 Java
异步&线程池 线程池的七大参数 初始化线程的4种方式 【上篇】
这篇文章详细介绍了Java中线程的四种初始化方式,包括继承Thread类、实现Runnable接口、实现Callable接口与FutureTask结合使用,以及使用线程池。同时,还深入探讨了线程池的七大参数及其作用,解释了线程池的运行流程,并列举了四种常见的线程池类型。最后,阐述了在开发中使用线程池的原因,如降低资源消耗、提高响应速度和增强线程的可管理性。
异步&线程池 线程池的七大参数 初始化线程的4种方式 【上篇】
|
3月前
|
消息中间件 Java 大数据
"深入理解Kafka单线程Consumer:核心参数配置、Java实现与实战指南"
【8月更文挑战第10天】在大数据领域,Apache Kafka以高吞吐和可扩展性成为主流数据流处理平台。Kafka的单线程Consumer因其实现简单且易于管理而在多种场景中受到欢迎。本文解析单线程Consumer的工作机制,强调其在错误处理和状态管理方面的优势,并通过详细参数说明及示例代码展示如何有效地使用KafkaConsumer类。了解这些内容将帮助开发者优化实时数据处理系统的性能与可靠性。
89 7
|
4月前
|
监控 Java
多线程线程池问题之创建线程如何解决
多线程线程池问题之创建线程如何解决
|
4月前
|
设计模式 并行计算 安全
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
50 0
|
4月前
|
存储 安全 Java
Java面试题:如何在Java应用中实现有效的内存优化?在多线程环境下,如何确保数据的线程安全?如何设计并实现一个基于ExecutorService的任务处理流程?
Java面试题:如何在Java应用中实现有效的内存优化?在多线程环境下,如何确保数据的线程安全?如何设计并实现一个基于ExecutorService的任务处理流程?
46 0
|
5月前
|
存储 Java
Java线程池参数详解及其示例
Java线程池参数详解及其示例