Java线程池如何执行?拒绝策略有哪些?

简介: 【8月更文挑战第8天】Java线程池如何执行?拒绝策略有哪些?

Java 中的线程池是一种管理线程的机制,它通过重用预先创建的线程来提高性能。在 Java 中,java.util.concurrent.ExecutorService 接口提供了线程池的功能实现,而 java.util.concurrent.ThreadPoolExecutor 类则是实现了线程池功能的核心类。

线程池的执行流程

  1. 提交任务:当一个任务被提交给线程池时(通过 submit()execute() 方法),如果线程池中有空闲线程,则该任务会被立即执行。
  2. 队列:如果没有空闲线程,那么任务会被放入一个阻塞队列中等待执行。
  3. 创建新线程:如果队列满了并且线程数量少于最大线程数,线程池会创建新的工作线程来执行任务。
  4. 拒绝策略:如果队列满了且达到了最大线程数,线程池会采取拒绝策略来处理无法执行的任务。

拒绝策略

线程池的拒绝策略是指当线程池无法接受更多的任务时所采取的措施。ThreadPoolExecutor 提供了四种标准的拒绝策略:

  1. AbortPolicy:默认的拒绝策略,抛出 RejectedExecutionException 异常,表明任务已经被拒绝。
  2. CallerRunsPolicy:调用者的线程(提交任务的线程)将会执行该任务。如果线程池中的所有线程都忙于处理其他任务,则该策略会直接在调用 execute() 方法的线程上运行任务。
  3. DiscardPolicy:默默地丢弃无法处理的任务,不会抛出异常也不会通知调用者。
  4. DiscardOldestPolicy:如果不能执行当前任务,则尝试从阻塞队列中移除最旧的任务,并尝试再次添加当前任务。如果队列为空,则此策略等同于 DiscardPolicy

此外,还可以通过继承 RejectedExecutionHandler 接口来自定义拒绝策略。

示例代码

下面是一个简单的示例,展示如何创建一个线程池并设置不同的拒绝策略:

import java.util.concurrent.*;

public class ThreadPoolExample {
   

    public static void main(String[] args) {
   
        // 创建线程池
        ExecutorService executor = new ThreadPoolExecutor(
                2, // 核心线程数
                4, // 最大线程数
                60L, // 空闲线程存活时间
                TimeUnit.SECONDS, // 时间单位
                new LinkedBlockingQueue<>(2), // 任务队列
                Executors.defaultThreadFactory(), // 线程工厂
                new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
        );

        // 提交任务
        for (int i = 0; i < 5; i++) {
   
            final int index = i;
            try {
   
                executor.execute(() -> {
   
                    System.out.println("Task " + index + " is running by " + Thread.currentThread().getName());
                    Thread.sleep(1000);
                });
            } catch (RejectedExecutionException e) {
   
                System.out.println("Task " + index + " was rejected.");
            }
        }

        // 关闭线程池
        executor.shutdown();
    }
}

在这个示例中,线程池的最大线程数为 4,队列大小为 2,因此当提交第 5 个任务时,由于没有可用的工作线程且队列已满,线程池会根据设置的拒绝策略来处理。这里我们设置了 CallerRunsPolicy,所以第 5 个任务会在主线程中执行。

通过这种方式,可以根据实际需求选择合适的拒绝策略来处理线程池的溢出情况。

目录
相关文章
|
8月前
|
存储 分布式计算 Java
Java 大视界 -- Java 大数据在智能建筑能耗监测与节能策略制定中的应用(182)
本文探讨了Java大数据技术在智能建筑能耗监测与节能策略制定中的关键应用。通过Hadoop、Spark等技术实现能耗数据的存储、分析与可视化,结合实际案例,展示了Java大数据如何助力建筑行业实现节能减排目标。
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
388 27
|
9月前
|
机器学习/深度学习 分布式计算 供应链
Java 大视界 ——Java 大数据在智能供应链库存优化与成本控制中的应用策略(172)
本文围绕 Java 大数据在智能供应链库存优化与成本控制中的应用展开,剖析库存管理现状与挑战,阐述大数据技术应用策略,结合真实案例与代码给出实操方案,助力企业提升库存管理效能,降低运营成本。
|
8月前
|
存储 Java 大数据
Java 大视界 -- Java 大数据在智能家居能源消耗模式分析与节能策略制定中的应用(198)
简介:本文探讨Java大数据技术在智能家居能源消耗分析与节能策略中的应用。通过数据采集、存储与智能分析,构建能耗模型,挖掘用电模式,制定设备调度策略,实现节能目标。结合实际案例,展示Java大数据在智能家居节能中的关键作用。
|
8月前
|
存储 数据采集 数据可视化
Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵溯源与治理策略展示中的应用(191)
本项目探索了基于Java的大数据可视化技术在城市交通拥堵溯源与治理策略中的应用。通过整合多源交通数据,利用Java生态中的大数据处理与可视化工具,构建了交通拥堵分析模型,并实现了拥堵成因的直观展示与治理效果的可视化评估。该方案为城市交通管理提供了科学、高效的决策支持,助力智慧城市建设。
|
9月前
|
Java 测试技术 API
现代化 java 分层开发实施策略与最佳实践指南
现代化Java分层开发采用清晰的多层架构,包括Controller、Service、Repository和DTO等核心层次。文章详细介绍了标准Maven/Gradle项目结构,各层职责与实现规范:实体层使用JPA注解,DTO层隔离数据传输,Repository继承JpaRepository,Service层处理业务逻辑,Controller层处理HTTP请求。推荐使用Spring Boot、Lombok、MapStruct等技术栈,并强调了单元测试和集成测试的重要性。这种分层设计提高了代码的可维护性、可测试
459 0
|
人工智能 自然语言处理 前端开发
从理论到实践:使用JAVA实现RAG、Agent、微调等六种常见大模型定制策略
大语言模型(LLM)在过去几年中彻底改变了自然语言处理领域,展现了在理解和生成类人文本方面的卓越能力。然而,通用LLM的开箱即用性能并不总能满足特定的业务需求或领域要求。为了将LLM更好地应用于实际场景,开发出了多种LLM定制策略。本文将深入探讨RAG(Retrieval Augmented Generation)、Agent、微调(Fine-Tuning)等六种常见的大模型定制策略,并使用JAVA进行demo处理,以期为AI资深架构师提供实践指导。
1853 73
|
9月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
494 1
|
存储 算法 Java
Java内存管理深度剖析与优化策略####
本文深入探讨了Java虚拟机(JVM)的内存管理机制,重点分析了堆内存的分配策略、垃圾回收算法以及如何通过调优提升应用性能。通过案例驱动的方式,揭示了常见内存泄漏的根源与解决策略,旨在为开发者提供实用的内存管理技巧,确保应用程序既高效又稳定地运行。 ####
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
563 16