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 个任务会在主线程中执行。

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

目录
相关文章
|
1月前
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
43 0
|
2月前
|
存储 算法 Java
Java内存管理深度剖析与优化策略####
本文深入探讨了Java虚拟机(JVM)的内存管理机制,重点分析了堆内存的分配策略、垃圾回收算法以及如何通过调优提升应用性能。通过案例驱动的方式,揭示了常见内存泄漏的根源与解决策略,旨在为开发者提供实用的内存管理技巧,确保应用程序既高效又稳定地运行。 ####
|
2月前
|
运维 Java 编译器
Java 异常处理:机制、策略与最佳实践
Java异常处理是确保程序稳定运行的关键。本文介绍Java异常处理的机制,包括异常类层次结构、try-catch-finally语句的使用,并探讨常见策略及最佳实践,帮助开发者有效管理错误和异常情况。
110 5
|
1月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
2月前
|
监控 算法 Java
Java虚拟机垃圾回收机制深度剖析与优化策略####
【10月更文挑战第21天】 本文旨在深入探讨Java虚拟机(JVM)中的垃圾回收机制,揭示其工作原理、常见算法及参数调优技巧。通过案例分析,展示如何根据应用特性调整GC策略,以提升Java应用的性能和稳定性,为开发者提供实战中的优化指南。 ####
47 5
|
2月前
|
Java
线程池内部机制:线程的保活与回收策略
【10月更文挑战第24天】 线程池是现代并发编程中管理线程资源的一种高效机制。它不仅能够复用线程,减少创建和销毁线程的开销,还能有效控制并发线程的数量,提高系统资源的利用率。本文将深入探讨线程池中线程的保活和回收机制,帮助你更好地理解和使用线程池。
110 2
|
3月前
|
消息中间件 监控 算法
Java性能优化:策略与实践
【10月更文挑战第21】Java性能优化:策略与实践
|
3月前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
76 4
|
3月前
|
存储 算法 Java
深入理解Java虚拟机(JVM)及其优化策略
【10月更文挑战第10天】深入理解Java虚拟机(JVM)及其优化策略
58 1
|
3月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)