14.jdk源码阅读之线程池(上)

Linux面试题大全:覆盖命令、权限、进程、网络与Shell脚本 Linux系统管理是运维、SRE及后端开发的核心技能,而命令行工具与系统原理的掌握程度往往决定技术面试的成败。从文件查询到文本处理,grep、find、awk等命令在日志分析与数据统计中扮演关键角色;用户权限模型、进程管理、网络排查与磁盘文件系统等知识模块,更是线上故障定位的必备能力。理解管道重定向的数据流机制,掌握ps、top、ss等工具的实际应用场景,能够帮助工程师从表象问题直达根因。本文整合了经典且高频的Linux面试题,覆盖基础命令、用户权限、进程管理、网络排查、磁盘与Shell脚本等方向,每道题不 阅读详情

1. 写在前面

Java 中的线程池是一种管理和复用线程的机制,用于减少线程创建和销毁的开销,提高应用程序的性能和资源利用率。线程池通过预先创建一定数量的线程,并在需要时复用这些线程来执行任务,从而避免了频繁的线程创建和销毁。在正式阅读线程池相关的代码之前,我先抛出几个问题看看大家有没有思考过:

  1. Java 中如何创建线程池?
  2. 线程池的核心参数有哪些?
  3. ThreadPoolExecutor 的工作原理是什么?
  4. 什么是拒绝策略?Java 提供了哪些拒绝策略?
  5. 如何优雅地关闭线程池?
  6. 如何创建一个自定义线程池?
  7. 如何监控线程池的状态?
  8. 在什么场景下使用 FixedThreadPool?
  9. 在什么场景下使用 CachedThreadPool?
  10. ScheduledThreadPoolExecutor 的用途是什么?
  11. 如何处理线程池中的异常?

2. 从使用说起

以下是一个简单的示例,展示了如何使用固定大小的线程池来执行多个任务:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample {
    public static void main(String[] args) {
        // 创建一个固定大小的线程池
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);

        for (int i = 0; i < 10; i++) {
            final int index = i;
            fixedThreadPool.execute(() -> {
                System.out.println("Task " + index + " is running in thread " + Thread.currentThread().getName());
                try {
                    Thread.sleep(1000); // 模拟任务执行时间
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            });
        }

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

2.1 线程池的基本概念

  • 线程池:一个包含多个线程的集合,这些线程可以被重复使用来执行多个任务。
  • 任务:需要在线程中执行的工作单元,通常是实现了 Runnable 接口或 Callable 接口的对象。
  • 工作队列:用于保存等待执行的任务的队列。
  • 线程池管理器:负责管理线程的创建、调度和销毁。

2.2 Java 中的线程池实现

Java 提供了 java.util.concurrent 包中的 Executor 框架来实现线程池。主要的类和接口包括:

  • Executor:一个简单的任务执行器接口,定义了 execute(Runnable command) 方法。
  • ExecutorService:继承自 Executor,提供了更丰富的线程池管理功能,如提交任务、关闭线程池等。
  • ThreadPoolExecutor:ExecutorService 的一个实现类,提供了灵活的线程池配置选项。
  • Executors:一个工厂类,提供了多种创建线程池的方法。

2.3 常见的线程池类型

通过 Executors 工厂类可以创建不同类型的线程池:

  1. FixedThreadPool:固定大小的线程池,适用于负载较重的服务器。
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
  1. CachedThreadPool:可缓存的线程池,适用于执行大量短期异步任务。
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
  1. SingleThreadExecutor:单线程的线程池,适用于需要顺序执行任务的场景。
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
  1. ScheduledThreadPool:支持定时和周期性任务执行的线程池。
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);

2.4 线程池的主要方法

  • submit:提交一个任务,返回一个 Future 对象,可以用来获取任务的执行结果或取消任务。
Future<Integer> future = fixedThreadPool.submit(() -> {
    // 任务逻辑
    return 42;
});
  • execute:提交一个 Runnable 任务,任务没有返回值。
fixedThreadPool.execute(() -> {
    // 任务逻辑
});
  • shutdown:关闭线程池,已提交的任务会继续执行,但不再接受新任务。
fixedThreadPool.shutdown();
  • shutdownNow:立即关闭线程池,尝试停止所有正在执行的任务并返回等待执行的任务列表。
List<Runnable> notExecutedTasks = fixedThreadPool.shutdownNow();
  • awaitTermination:等待所有任务完成或超时。
fixedThreadPool.awaitTermination(1, TimeUnit.MINUTES);

2.5 线程池的优势

  1. 减少线程创建和销毁的开销:通过复用线程,避免了频繁的线程创建和销毁,降低了系统资源的消耗。
  2. 提高响应速度:任务到达时不需要等待线程创建,可以立即执行,提高了响应速度。
  3. 更好的资源管理:通过限制线程池中的线程数量,可以避免资源的过度使用,防止系统过载。
  4. 统一的任务管理:线程池提供了统一的任务提交、执行、管理和监控机制,简化了多线程编程。

2.6 线程池的配置参数

通过 ThreadPoolExecutor 可以灵活配置线程池的参数:

  • corePoolSize:核心线程数,线程池中始终保留的线程数。
  • maximumPoolSize:最大线程数,线程池中允许的最大线程数。
  • keepAliveTime:线程空闲时间,超过这个时间的空闲线程会被销毁。
  • unit:时间单位,配合 keepAliveTime 使用。
  • workQueue:任务队列,保存等待执行的任务。
  • threadFactory:线程工厂,用于创建新线程。
  • handler:拒绝策略,当任务太多无法处理时的处理方式。
    下面的代码示例展示了这些参数的使用:
import java.util.concurrent.*;

public class CustomThreadPoolExample {
    public static void main(String[] args) {
        // 自定义线程池
        ThreadPoolExecutor customThreadPool = new ThreadPoolExecutor(
            2, // corePoolSize
            4, // maximumPoolSize
            60, // keepAliveTime
            TimeUnit.SECONDS, // unit
            new LinkedBlockingQueue<>(10), // workQueue
            Executors.defaultThreadFactory(), // threadFactory
            new ThreadPoolExecutor.AbortPolicy() // handler
        );

        for (int i = 0; i < 15; i++) {
            final int index = i;
            customThreadPool.execute(() -> {
                System.out.println("Task " + index + " is running in thread " + Thread.currentThread().getName());
                try {
                    Thread.sleep(1000); // 模拟任务执行时间
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            });
        }

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

3. ThreadPoolExecutor 的工作原理是什么?

  1. 当提交任务时,如果当前线程数小于 corePoolSize,则创建新线程执行任务。
  2. 如果当前线程数达到 corePoolSize,任务被加入到 workQueue 中。
  3. 如果 workQueue 满了,且线程数小于 maximumPoolSize,则创建新线程执行任务。
  4. 如果线程数达到 maximumPoolSize,则根据拒绝策略处理任务。

4. 什么是拒绝策略?Java 提供了哪些拒绝策略?

拒绝策略是在线程池无法处理新任务时的处理方式。Java 提供了以下几种拒绝策略:

  • AbortPolicy:抛出 RejectedExecutionException。
  • CallerRunsPolicy:由调用线程执行任务。
  • DiscardPolicy:丢弃任务,不抛出异常。
  • DiscardOldestPolicy:丢弃最早的未处理任务,然后尝试重新提交任务。
    这里我再问一个高级面试题:线程池的拒绝策略是谁来执行的? 我们在文末给出答案,大家想思考下。

5. 如何监控线程池的状态?

可以通过 ThreadPoolExecutor 提供的方法获取线程池的状态信息:

  • getPoolSize:获取当前线程池中的线程数。
  • getActiveCount:获取当前正在执行任务的线程数。
  • getCompletedTaskCount:获取已完成的任务数。
  • getTaskCount:获取已提交的任务总数。

6. ScheduledThreadPoolExecutor 的用途是什么?

ScheduledThreadPoolExecutor 是 Java 中用于执行定时任务和周期性任务的线程池实现。它继承自 ThreadPoolExecutor,并扩展了其功能,使其能够调度任务在指定的时间点执行或以固定的时间间隔重复执行。

6.1 主要用途

  1. 定时任务:在指定的延迟时间后执行一次任务。
  2. 周期性任务:以固定的时间间隔重复执行任务。

6.2 主要方法

  • schedule(Runnable command, long delay, TimeUnit unit):在指定的延迟时间后执行一次任务。
  • schedule(Callable callable, long delay, TimeUnit unit):在指定的延迟时间后执行一次任务,并返回一个 Future 代表任务的结果。
  • scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit):以固定的时间间隔重复执行任务,初始延迟后第一次执行,然后每隔指定时间执行一次。
  • scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit):以固定的延迟时间重复执行任务,初始延迟后第一次执行,然后每次任务执行完毕后等待指定的时间再执行下一次。

6.3 定时任务

在指定的延迟时间后执行一次任务:

import java.util.concurrent.*;

public class ScheduledThreadPoolExecutorExample {
    public static void main(String[] args) {
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);

        Runnable task = () -> System.out.println("Task executed at " + System.currentTimeMillis());

        // 在3秒后执行一次任务
        scheduledExecutorService.schedule(task, 3, TimeUnit.SECONDS);

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

6.4 周期性任务(固定速率)

以固定的时间间隔重复执行任务:

import java.util.concurrent.*;

public class ScheduledThreadPoolExecutorFixedRateExample {
    public static void main(String[] args) {
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);

        Runnable task = () -> System.out.println("Task executed at " + System.currentTimeMillis());

        // 在初始延迟1秒后,以固定的时间间隔3秒重复执行任务
        scheduledExecutorService.scheduleAtFixedRate(task, 1, 3, TimeUnit.SECONDS);

        // 运行一段时间后关闭线程池
        try {
            Thread.sleep(10000); // 运行10秒
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        scheduledExecutorService.shutdown();
    }
}

6.5 周期性任务(固定延迟)

每次任务执行完毕后等待指定的时间再执行下一次:

import java.util.concurrent.*;

public class ScheduledThreadPoolExecutorFixedDelayExample {
    public static void main(String[] args) {
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);

        Runnable task = () -> {
            System.out.println("Task executed at " + System.currentTimeMillis());
            try {
                Thread.sleep(2000); // 模拟任务执行时间
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        };

        // 在初始延迟1秒后,每次任务执行完毕后等待3秒再执行下一次
        scheduledExecutorService.scheduleWithFixedDelay(task, 1, 3, TimeUnit.SECONDS);

        // 运行一段时间后关闭线程池
        try {
            Thread.sleep(10000); // 运行10秒
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        scheduledExecutorService.shutdown();
    }
}

7. 如何处理线程池中的异常?

在使用线程池时,处理线程中的异常是非常重要的。因为线程池中的任务是异步执行的,如果任务抛出异常而不进行处理,可能会导致任务失败且无法被检测到,从而影响系统的稳定性和可靠性。

以下是几种处理线程池中异常的方法:

7.1 使用 Future 获取异常

当提交任务时,可以使用 submit 方法返回一个 Future 对象,通过 Future.get() 方法可以捕获任务执行过程中抛出的异常。

import java.util.concurrent.*;

public class FutureExceptionHandlingExample {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(2);

        Callable<Integer> task = () -> {
            System.out.println("Task started");
            throw new RuntimeException("Exception in task");
        };

        Future<Integer> future = executorService.submit(task);

        try {
            future.get(); // This will throw ExecutionException if the task threw an exception
        } catch (InterruptedException | ExecutionException e) {
            System.err.println("Exception caught: " + e.getCause());
        }

        executorService.shutdown();
    }
}

7.2 重写 ThreadPoolExecutor 的 afterExecute 方法

通过重写 ThreadPoolExecutor 的 afterExecute 方法,可以在任务执行完毕后捕获异常。

import java.util.concurrent.*;

public class AfterExecuteExceptionHandlingExample {
    public static void main(String[] args) {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
            2, 4, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>()) {
            
            @Override
            protected void afterExecute(Runnable r, Throwable t) {
                super.afterExecute(r, t);
                if (t == null && r instanceof Future<?>) {
                    try {
                        Object result = ((Future<?>) r).get();
                    } catch (CancellationException ce) {
                        t = ce;
                    } catch (ExecutionException ee) {
                        t = ee.getCause();
                    } catch (InterruptedException ie) {
                        Thread.currentThread().interrupt(); // ignore/reset
                    }
                }
                if (t != null) {
                    System.err.println("Exception caught: " + t);
                }
            }
        };

        Runnable task = () -> {
            System.out.println("Task started");
            throw new RuntimeException("Exception in task");
        };

        executor.execute(task);

        executor.shutdown();
    }
}

7.3 使用自定义的 ThreadFactory

通过自定义 ThreadFactory,可以为每个线程设置一个 UncaughtExceptionHandler,捕获线程中未捕获的异常。

import java.util.concurrent.*;

public class ThreadFactoryExceptionHandlingExample {
    public static void main(String[] args) {
        ThreadFactory threadFactory = new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                Thread thread = new Thread(r);
                thread.setUncaughtExceptionHandler((t, e) -> {
                    System.err.println("Exception caught in thread " + t.getName() + ": " + e);
                });
                return thread;
            }
        };

        ExecutorService executorService = Executors.newFixedThreadPool(2, threadFactory);

        Runnable task = () -> {
            System.out.println("Task started");
            throw new RuntimeException("Exception in task");
        };

        executorService.execute(task);

        executorService.shutdown();
    }
}

7.4 使用 try-catch 块

在任务内部使用 try-catch 块捕获异常,并进行相应的处理。

import java.util.concurrent.*;

public class TryCatchExceptionHandlingExample {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(2);

        Runnable task = () -> {
            try {
                System.out.println("Task started");
                throw new RuntimeException("Exception in task");
            } catch (Exception e) {
                System.err.println("Exception caught in task: " + e);
            }
        };

        executorService.execute(task);

        executorService.shutdown();
    }
}

8. 线程池的拒绝策略是谁执行的?

拒绝策略是由调用线程池的 execute 方法的线程执行的。也就是说,当你在主线程或其他线程中调用线程池的 execute 方法时,如果任务被拒绝,拒绝策略会在调用 execute 方法的那个线程中执行。

系列文章

1.JDK源码阅读之环境搭建

2.JDK源码阅读之目录介绍

3.jdk源码阅读之ArrayList(上)

4.jdk源码阅读之ArrayList(下)

5.jdk源码阅读之HashMap

6.jdk源码阅读之HashMap(下)

7.jdk源码阅读之ConcurrentHashMap(上)

8.jdk源码阅读之ConcurrentHashMap(下)

9.jdk源码阅读之ThreadLocal

10.jdk源码阅读之ReentrantLock

11.jdk源码阅读之CountDownLatch

12.jdk源码阅读之CyclicBarrier

13.jdk源码阅读之Semaphore

JavaScript China城市联动 中国全城市的地址省,市,县 <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title></title> <script src="jquery.js"></script> <script src="json.js"></... 阅读详情

相关推荐

Word中 Go to endnote 出现闪退问题解决办法

Word中 Go to endnote 出现闪退问题解决办法

努力努力努力 1万+

《并发编程》--14.Java线程池和自定义线程

为了避免频繁的创建和销毁线程,减少CPU的压力,线程池就应运而生。 newFixedThreadPool()方法:该方法返回一个只有一个线程的线程池,该线程池的数量是固定始终不变。当有新任务提交时,线程池中若有空闲线程,将会立即执行。若么有空闲线程,则会被暂存在任务队列中,待有空闲线程时,才能处理任务队列的任务。 newSingleThreadExecutor()方法:该方法返回一个只有一

不如养猪! 315

深入浅出ASAP2标准:手把手教你编写和解析A2L文件(含Python示例代码)

本文深入解析ASAP2标准下的A2L文件,涵盖基础概念、文件结构及Python实现代码,帮助开发者掌握汽车ECU标定和测量中的关键数据管理技术。通过详细示例,展示如何编写和解析A2L文件,提升电控数据管理效率。

happy2的博客 1095

JDK线程池框架Executor源码阅读

Executor框架 Executor ExecutorService AbstractExecutorService ThreadPoolExecutor ThreadPoolExecutor继承AbstractExecutorService,是一个线程池的具体的实现 内部类 Worker private final class Worker exte...

weixin_30652271的博客 106

TP4054充电电路发热严重?手把手教你调整电阻值降低温度(附实测数据)

本文针对TP4054锂电池充电电路发热严重的问题,提供了详细的排错与解决方案。通过分析发热原理,指出核心在于PROG引脚电阻值设定,并手把手指导如何计算和选择正确的电阻以降低充电电流与温度。文末附有不同电阻下的实测温度与性能数据,为电子爱好者和工程师提供了实用的调试参考。

p4q5r6s7t的博客 399

Ghidra逆向分析实战:从安装JDK到解析STM32的bin文件(附SVD插件配置)

本文详细介绍了使用Ghidra进行STM32固件逆向分析的完整流程,从JDK安装配置到SVD插件的应用。通过实战案例展示如何解析bin文件、恢复符号信息以及利用SVD插件识别外设寄存器,帮助开发者高效完成嵌入式设备的逆向工程任务。

weixin_29309475的博客 637

《深入理解高并发编程:JDK核心技术》-冰河新书上市

深入理解核心原理、案例实战和系统架构,再熟悉或精通JDK中提供的各种并发编程类库和线程池,还能自己手写线程池,这应该能超越大部分人吧?

冰河的专栏 2770

Workbuddy+DeepSeek V4傻瓜流配置全指南:API接入、模型切换与Agent实战

AI编程助手的核心价值不在于模型本身,而在于如何稳定、安全、低门槛地调用其能力。Agent作为智能体范式,依赖可靠的运行时环境与标准化API通信;DeepSeek V4系列凭借高吞吐、低延迟和强工具调用支持,成为当前生产级Agent的理想引擎。Workbuddy则通过本地配置管理、环境变量注入与UTF-8无BOM容错等工程设计,将复杂部署简化为可复现、可版本化、可团队协同的实践流程。本文聚焦API接入路径下的真实卡点——从Key获取验证、models.json字段语义到沙箱权限控制,覆盖开发者在Window

weixin_33702545的博客 2301

【并发编程五:Java中的线程池(2)-线程池的实现原理】

【并发编程五:Java中的线程池(2)-线程池的实现原理】

weixin_43333483的博客 1052

【数学模型】灰色关联分析

数学模型-灰色关联分析

suic009的博客 1万+

提示工程架构师干货:AI上下文工程在社交媒体舆情溯源中的应用

在舆情溯源中,“上下文”不是单一的“文本内容”,而是多维度、多源的信息集合溯源时间:从事件爆发到找到源头,只用了24小时(传统方法需要3-5天);溯源准确性:100%(通过人工验证确认);后续行动:品牌X发布了澄清声明,揭露了品牌Y的恶意行为,舆情在48小时内平息。社交媒体舆情溯源是一个“复杂的系统工程”,需要结合数据、模型、上下文理解。AI上下文工程的出现,让我们从“被动应对”转向“主动溯源”,从“模糊判断”转向“精准分析”。

Java大师兄的博客 807

书评 | 《深入理解高并发编程:JDK核心技术》

书评 | 《深入理解高并发编程:JDK核心技术》

wei_shuo的博客 2163

2.3 MMU Notifier(上):KVM 催生的页表变化通知

探讨了MMU Notifier机制的作用及其在虚拟化等场景中的应用。当CPU页表发生变更(如munmap、页面迁移等操作)时,需要通知拥有"第二套页表"的子系统(如KVM的EPT/NPT、IOMMU、GPU等)失效其映射。MMU Notifier通过订阅-通知机制实现这一功能,核心数据结构包括mmu_notifier订阅对象和回调接口mmu_notifier_ops。当CPU页表修改时,通过mmu_notifier_range描述变更范围,调用订阅者的回调函数进行同步,确保外部MMU与CPU页表一致性。

图形/计算GPU的驱动与虚拟化技术分享园地 1004

书评 《深入理解高并发编程:JDK核心技术》_深入理解高并发编程 核心原理与案例实战(1)

通过阅读和学习本书,读者可以更加全面、深入、透彻地理解JDK高并发编程知识,提高对高并发编程问题的处理能力和项目实战能力,并提高站在更高层面解决高并发编程系统架构问题的能力。

2401_84975923的博客 903

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

几种线程池的实现算法分析

1. 前言 在阅读研究线程池的源码之前,一直感觉线程池是一个框架中最高深的技术。研究后才发现,线程池的实现是如此精巧。本文从技术角度分析了线程池的本质原理和组成,同时分析了JDK、Jetty6、Jetty8、Tomcat的源码实现,对于想了解线程池本质、更好的使用线程池或者定制实现自己的线程池的业务场景具有一定指导意义。 2. 使用线程池的意义 复用:类似WEB服务器等系统,

ThinkCode的专栏 503

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

通过transmittable-thread-local源码理解线程池线程本地变量传递的原理

前提最近一两个月花了很大的功夫做UCloud服务和中间件迁移到阿里云的工作,没什么空闲时间撸文。想起很早之前写过ThreadLocal的源码分析相关文章,里面提到了ThreadLocal...

HollisChuang's Blog 1077

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

线程池传递对象参数_通过transmittable-thread-local源码理解线程池线程本地变量传递的原理

前提最近一两个月花了很大的功夫做UCloud服务和中间件迁移到阿里云的工作,没什么空闲时间撸文。想起很早之前写过ThreadLocal的源码分析相关文章,里面提到了ThreadLocal存在一个不能向预先创建的线程中进行变量传递的局限性,刚好有一位HSBC的技术大牛前同事提到了团队引入了transmittable-thread-local解决了此问题。借着这个契机,顺便clone了transmit...

weixin_39878745的博客 790

JDK源码

【JDK1.8】Java 8源码阅读汇总 【JDK1.8】JDK1.8集合源码阅读——总章 【JDK1.8】JDK1.8集合源码阅读——HashMap 【JDK1.8】JDK1.8集合源码阅读——LinkedHashMap 【JDK1.8】JDK1.8集合源码阅读——TreeMap(一) 【JDK1.8】JDK1.8集合源码阅读——TreeMap(二) 【JDK1.8】JD...

weixin_30399821的博客 172

引入 WebSocket 后 Spring 线程池突然消失?从源码深挖到落地解决(附 JDK17 完整实例)

本文深入分析了SpringBoot+WebSocket项目中线程池注入失败的常见问题。通过源码追踪发现,WebSocket的自动配置会创建Executor类型Bean,导致Spring默认线程池applicationTaskExecutor因条件不满足而无法创建。文章提供了三种解决方案:推荐方案是显式定义自定义线程池(附完整配置代码);其次可复用WebSocket线程池;最后介绍了强制启用默认线程池的方法(不推荐)。

果酱 の 博客 915

NioEventLoopGroup 源码分析

NioEventLoopGroup 源码分析1. 在阅读源码时做了一定的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限。为了方便 IDE 查看、跟踪、调试 代码,所以在 github上提供 netty 的源码、详细的注释及测试用例。欢迎大家 star、fork !2. 由于个人水平有限,对源码的分析理解可能存在偏差或不透彻的地方还请大家在评论区指出,谢谢!从今天开始,就准备进军 ne...

James的博客 1009

书评 《深入理解高并发编程:JDK核心技术》_深入理解高并发编程 核心原理与案例实战(3)

冰河:互联网资深技术专家、数据库技术专家、分布式与微服务架构专家;多年来一直致力于分布式系统架构、微服务、分布式数据库、分布式事务与大数据技术的研究,在高并发、高可用、高可扩展性、高可维护性和大数据等领域拥有丰富的架构开发经验。可视化多数据源数据异构中间件mykit-data作者,畅销书《深入理解高并发编程;核心原理与案例实战》《深入理解分布式事务:原理与实战》《海量数据处理与大数据技术实战》和《MySQL技术大全:开发、优化与运维实战》作者,"冰河技术"微信公众号作者。

2401_84975937的博客 286

面试官:你背了几道面试题就敢说熟悉Java源码?对不起,我们不招连源码都不会看的人。别慌,这份源码解析来帮你!

“请你简单说一下substring的实现过程” 是的,我没有看过这一题,平时使用的时候,也不会去看这个方法的源码,我支支吾吾的回答不上来,我能感觉到我的脸红到发烫。他好像看出了我的窘迫,于是接着说“你真的看过源码么?substring是一个很简单的方法,如果你真的看过,不可能不知道”,到这个地步,我也只好坦白,我没有看过源码,是的我其实连简单的substring怎么实现的都不知道,我甚至都找不到String类的源码。

m0_57042151的博客 151

书评 《深入理解高并发编程:JDK核心技术》_深入理解高并发编程 核心原理与案例实战

随着计算机与互联网技术的不断发展,CPU硬件的核心数也在不断提升,并发编程越来越普及,但是并发编程并不像其他业务那样简单明了。在编写并发程序时,往往会出现各种各样的Bug,这些Bug常常以某种"诡异"的形式出现,然后迅速消失,并且在大部分场景下难以复现。所以,高并发编程着实是一项让程序员头疼的技术。

2401_84975937的博客 516

GitHub爆赞!阿里P8力荐的 Java源码解析及面试合集

那么现在我要问你三个问题: 你看源码么? 你会看源码么? 你从源码中有收获么? 阅读源码绝对是每个程序员都需要的技能,即使刚开始很难读懂,也要慢慢去习惯

老男孩的架构路 379

突然就懵了!面试官问我:线程池中多余的线程是如何回收的?

推荐阅读: 这套Github上40K+star学习笔记,可以帮你搞定95%以上的Java面试 毫不夸张的说,这份SpringBoot学习指南能解决你遇到的98%的问题 给跪了!这套万人期待的 SQL 成神之路PDF,终于开源了 最近阅读了JDK线程池ThreadPoolExecutor的源码,对线程池执行任务的流程有了大体了解,实际上这个流程也十分通俗易懂,就不再赘述了,别人写的比我好多了。 ...

xingduan5153的博客 157

书评 《深入理解高并发编程:JDK核心技术》_深入理解高并发编程 核心原理与案例实战(2)

随着计算机与互联网技术的不断发展,CPU硬件的核心数也在不断提升,并发编程越来越普及,但是并发编程并不像其他业务那样简单明了。在编写并发程序时,往往会出现各种各样的Bug,这些Bug常常以某种"诡异"的形式出现,然后迅速消失,并且在大部分场景下难以复现。所以,高并发编程着实是一项让程序员头疼的技术。

2401_84975923的博客 491
上一篇: 13.jdk源码阅读之Semaphore
下一篇: 15.jdk源码阅读之线程池(下)
至真源
博客等级 码龄11年 665粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

至真源

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值