线程以及线程池的学习与使用

Codex CLI 接入智谱 GLM-5.1 完整教程 Codex CLI 是 OpenAI 推出的命令行 AI 编程工具,支持自主读取文件、执行命令、编写代码等操作,是目前最火的终端 AI 编程工具之一。通过 CLIProxyAPI 代理,我们成功将 Codex CLI 与智谱 GLM-5.1 模型对接,核心在于解决 Responses API 与 Chat Completions API 的协议转换问题。✅成熟稳定:CLIProxyAPI 社区活跃(4.7k fork),持续维护✅完整兼容:支持流式/非流式、function calling✅低成本。 阅读详情

1. 线程的基本知识

        线程是我们工作中必然会接触到的一个概念,线程是程序执行的最小单元。线程的状态有五个,分别是新建、就绪、运行、阻塞、死亡。各个状态之间的流转关系如下

线程的创建有三种方式,分别是:

  1. 继承Thread类
  2. 实现Runnable接口
  3. 实现Callable接口

三种实现方式中,第一种实现的本质也是实现了Runnable接口,简单演示一下三种创建线程的方式。

1.1 继承Thread类

        创建的方式就是继承Thread类,重写run方法,详情如下

package com.study.rabbitmq.test;

/**
 * @Author alen
 * @DATE 2022/6/19 8:49
 */
public class MyThread extends Thread {

    @Override
    public void run() {
        System.out.println("hello...");
    }

    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        t1.start();
    }
}

使用start()方法来启动线程,让线程进入就绪状态,等待CPU资源,然后执行。

1.2 实现Runnable接口

        创建方式是实现Runnable接口,重写run方法,详情代码如下

package com.study.rabbitmq.test;

/**
 * @Author alen
 * @DATE 2022/6/19 8:58
 */
public class MyRunnableTest implements Runnable {

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + ":hello....");
    }

    public static void main(String[] args) {
        MyRunnableTest t1 = new MyRunnableTest();
        new Thread(t1, "自定义线程名称").start();
    }
}

1.3 实现Callable接口

        实现Callable接口,重写call方法,详情如下

package com.study.rabbitmq.test;

import java.util.concurrent.*;

/**
 * @Author alen
 * @DATE 2022/6/19 9:04
 */
public class MyCallableTest implements Callable<Boolean> {

    @Override
    public Boolean call() throws Exception {
        System.out.println("信息:hello...");
        return true;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyCallableTest t1 = new MyCallableTest();
        //线程池的创建
        ExecutorService executor = Executors.newFixedThreadPool(1);
        //提交执行
        Future<Boolean> submit = executor.submit(t1);
        //获取执行结果
        Boolean flag = submit.get();
        System.out.println("flag:" + flag);
    }
}

这种方式的使用,本质上是线程池的使用。线程池的使用在我们工作中也比较常见,典型的就是各类数据库的连接都是使用了线程池。线程池可以理解为是线程提前创建好,放在一个次子里面,要用的时候,就把线程拿出来使用。

2. 线程池ThreadPoolExecutor

        由于线程的创建是比较消耗资源的,在高并发的请求下,频繁的创建和销毁线程对于资源来说是非常浪费的。也会极大的降低资源的处理能力,所以需要使用线程池。线程创建后,放入线程池。然后线程不断复用,达到提升处理效率。

2.1 线程池ThreadPoolExecutor的创建

        在学习线程池ThreadPoolExecutor时,对于其几个核心的参数一定需要先了解清楚。参数的解释如下,ThreadPoolExecutor的构造函数源码如下:

/**
 * ThreadPoolExecutor构造函数
 *
 * @param corePoolSize 核心线程数。默认情况下,核心线程会一直存活,但将allowCoreThreadTimeout设置为true时,核心线程也会超时回收
 * @param maximumPoolSize 线程池所能容纳的最大线程数。当活跃线程数达到该数值后,后续的新任务将会阻塞
 * @param keepAliveTime 线程闲置超时时长。如果超过该时长,非核心线程就会被回收
 * @param unit 指定keepAliveTime参数的时间单位。常用的有:TimeUnit.MILLISECONDS(毫秒)、TimeUnit.SECONDS(秒)、TimeUnit.MINUTES(分)
 * @param workQueue 任务队列,当线程处理不过来时,任务暂时存放队列中
 * @param threadFactory 线程工厂。用于指定为线程池创建新线程的方式
 * @param handler 拒绝策略。当达到最大线程数时需要执行的饱和策略
 */
public ThreadPoolExecutor(int corePoolSize,
						  int maximumPoolSize,
						  long keepAliveTime,
						  TimeUnit unit,
						  BlockingQueue<Runnable> workQueue,
						  ThreadFactory threadFactory,
						  RejectedExecutionHandler handler) {
	if (corePoolSize < 0 ||
			maximumPoolSize <= 0 ||
			maximumPoolSize < corePoolSize ||
			keepAliveTime < 0)
		throw new IllegalArgumentException();
	if (workQueue == null || threadFactory == null || handler == null)
		throw new NullPointerException();
	this.acc = System.getSecurityManager() == null ?
			null :
			AccessController.getContext();
	this.corePoolSize = corePoolSize;
	this.maximumPoolSize = maximumPoolSize;
	this.workQueue = workQueue;
	this.keepAliveTime = unit.toNanos(keepAliveTime);
	this.threadFactory = threadFactory;
	this.handler = handler;
}

其中拒绝策略有很多种,具体如下

//丢弃任务并抛出RejectedExecutionException异常。
ThreadPoolExecutor.AbortPolicy;
//也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardPolicy;
//丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.DiscardOldestPolicy;
//由调用线程处理该任务
ThreadPoolExecutor.CallerRunsPolicy;

使用代码如下

package com.study.rabbitmq.test.pool;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @Author alen
 * @DATE 2022/6/19 9:27
 */
public class ThreadPoolExecutorTest {

    //核心线程数
    private static final Integer CORE_POOL_SIZE = 20;
    //最大线程数
    private static final Integer MAXIMUM_POOL_SIZE = 20;
    //线程空闲超时时长
    private static final Long KEEP_ALIVE_TIME = 120L;

    public static void main(String[] args) {
        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE,
                                                                MAXIMUM_POOL_SIZE,
                                                                KEEP_ALIVE_TIME,
                                                                TimeUnit.HOURS,
                                                                new LinkedBlockingQueue<>(100),
                                                                Executors.defaultThreadFactory(),
                                                                new ThreadPoolExecutor.AbortPolicy());

        for (int i = 0; i < 100; i++) {
            poolExecutor.execute(() -> {
                System.out.println(Thread.currentThread().getName() + ":hello.....");
            });
        }
    }
}

线程池中有五种常见的创建方式,分别是

  1. Executors.newCachedThreadPool():可缓存线程池
  2. Executors.newFixedThreadPool(10):固定大小的线程池
  3. Executors.newScheduledThreadPool(2):任务调度的线程池
  4. Executors.newSingleThreadExecutor():单线程的线程池
  5. Executors.newWorkStealingPool():足够大小的线程池

这些线程池的创建底层都是通过创建ThreadPoolExecutor对象,不同类型的线程池的参数不同而已。

3. 线程池的原理

        线程池ThreadPoolExecutor对象中最核心的方法execute(),所以我们得理解这个方法的逻辑。源码如下

public void execute(Runnable command) {
	if (command == null)
		throw new NullPointerException();
	
	/*
	*分三步进行:
	*
	* 1. 如果运行的线程少于corePoolSize,请尝试
	* 以给定命令作为第一个线程启动新线程
	* 任务。对addWorker的调用以原子方式检查运行状态和
	* workerCount,从而防止错误警报
	* 在不应该的情况下,通过返回false来执行线程。
	*
	* 2. 如果任务可以成功排队,那么我们仍然需要
	* 再次检查是否应该添加线程
	*(因为自上次检查以来,现有的已死亡)或
	* 自进入此方法以来,池已关闭。所以我们
	* 重新检查状态,如有必要,在以下情况下回滚排队
	* 已停止,如果没有线程,则启动新线程。
	* 3. 如果无法将任务排队,则尝试添加新的
	* 螺纹。如果失败了,我们知道我们已经被关闭或饱和了
	* 所以拒绝这个任务。
	*/
	int c = ctl.get();
	if (workerCountOf(c) < corePoolSize) {
		if (addWorker(command, true))
			return;
		c = ctl.get();
	}
	if (isRunning(c) && workQueue.offer(command)) {
		int recheck = ctl.get();
		if (! isRunning(recheck) && remove(command))
			reject(command);
		else if (workerCountOf(recheck) == 0)
			addWorker(null, false);
	}
	else if (!addWorker(command, false))
		reject(command);
}

更详细的源码分析,后续使用新的博客来分析。

4. Spring Boot中使用多线程

4.1 添加配置类

        新建配置类,在配置类中配置线程池的相关配置,配置详情如下

package com.test.executor.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

/**
 * @Author alen
 * @DATE 2022/3/8 13:48
 * 线程池配置类
 */
@Configuration
//开启线程池
@EnableAsync
public class TaskExecutorConfig {

    @Bean(name = "threadPoolTaskExecutor")
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 核心线程数
        executor.setCorePoolSize(10);
        // 最大线程数
        executor.setMaxPoolSize(20);
        // 队列大小
        executor.setQueueCapacity(100);
        // 线程空闲超时时间
        executor.setKeepAliveSeconds(30);
        // 是否允许超时 true:允许 false:不允许
        executor.setAllowCoreThreadTimeOut(true);
        // 线程名字前缀
        executor.setThreadNamePrefix("thread-task-pool-");
        // 拒绝策列 AbortPolicy:队列满后新进的任务直接拒绝并抛出异常
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
        // 设置关闭线程池时,需要等待线程执行完成后方可关闭
        executor.setWaitForTasksToCompleteOnShutdown(true);
        // 初始化
        executor.initialize();
        return executor;
    }
}

4.2 线程池业务中使用

        创建一个业务处理类,类中的业务处理方法标识为异步并且指定使用的线程池,详情如下

package com.test.executor.service.impl;

import com.test.executor.service.ExecutorService;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

/**
 * @Author alen
 * @DATE 2022/3/8 14:44
 */
@Service
public class ExecutorServiceImpl implements ExecutorService {

    /**
     * 此逻辑将使用线程池处理
     */
    @Async("threadPoolTaskExecutor")
    public void seat() {
        try {
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName() + "-----线程池开始处理任务");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

业务处理在逻辑中的使用如下

package com.test.executor.controller;

import com.test.executor.service.ExecutorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author alen
 * @DATE 2022/3/8 14:29
 */
@RestController
@RequestMapping("/test")
public class ExecutorController {

    @Autowired
    private ExecutorService executorService;

    @GetMapping("/seat")
    public String test() {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10; i++) {
            executorService.seat();
        }
        long end = System.currentTimeMillis();
        return "任务执行中。。。" + (end - start) + "ms";
    }
}

可以自行测试一下。线程池的基础知识就先了解到这。

3、无限维系统理论中的算子与半群:概念、定理及应用 本博文深入探讨了无限维系统理论中的两个核心概念:里茨谱算子与卢默-菲利普斯定理。文章首先介绍了里茨基的定义与性质,分析了谱、预解集及特征值在无限维系统中的特性,并详细阐述了里茨谱算子的条件及其生成C0-半群的能力,结合阻尼欧拉-伯努利梁模型展示了其应用。随后,文章介绍了卢默-菲利普斯定理及其推论,通过多个偏微分方程实例(如一阶方程、柔性梁、波动方程和扩散问题)说明如何利用该定理判断算子是否生成压缩半群。此外,还强调了状态空间选择和边界条件对系统适定性的重要影响,并总结了相关问题的解决步骤与方法。 阅读详情

相关推荐

二、基于C语言的JPEG解码代码详解

// JPEG解码 // 输入JPEG后输出Bitmap #include <stdio.h> #include <stdlib.h> #pragma warning(disable : 4996) unsigned int BuffIndex; // JPEG数据的位置 unsigned int BuffSize; // JPEG数据的大小 unsigned int BuffX; // 图像的横向尺寸 unsigned int BuffY; //

m0_37633745的博客 4452

线程和线程池的创建及使用

三种创建线程的方法 一、通过继承 Thread 类本身 public class MyThread extends Thread { @Override public void run(){ super.run(); System.out.println("执行子线程..."); } } public class Test {...

Henry_Lin_Wind的博客 2158

zedboard(5)spi轮询和中断

一个SPI可以有几个从设备 在程序中使用 s32 XSpiPs_SetSlaveSelect(XSpiPs *InstancePtr, u8 SlaveSel) 选择。其实就是吧对应设备的ss拉低。 备注:只选一个ss,可以不用指定。(感觉,还没测试) 这是xspips.c中定义的函数,发送和接收有 XSpiPs_Transfer 和 XSpiPs_PolledTransfer 两个函数,分别采用中断和轮询模式。    一、轮询模式 米联客参考代码,SpiPs_Init中部分和官方例程流程一样,Spi

Kiss丶小坏 5889

多线程复习总结之线程池的创建及使用

在面试中,线程池是其中的一大考点。本篇博客则记录关于线程池的一些总结,包括线程池的使用原因、创建线程池、线程池的形式及线程池的工作流程,希望能对你更好的理解线程有帮助。

weixin_45974176的博客 4104

golang任意代码免杀绕过火绒+电脑管家

火绒和电脑管家主要以静态规则为主,但是有时候静态杀起来也挺让人奔溃的,这边分享一下如何拿捏火绒和电脑管家本文主要介绍如何通过garble进行混淆编译来绕过火绒,garble也可以绕过其他杀软,但是对火绒和电脑管家特别有效果,以火绒为例 下面来对比一下golang原生和garble混淆编译后得差距来一个很原始的的shellcode loader代码,将原始shellcode base64后就进行加载执行。

2301_79571829的博客 1533

STM32F401RET6寄存器手册阅读标记

对于时钟树配置,可参考STM32CubeMX中的时钟树配置,STM32CubeMX将基础配置图像化,较为简单。RCC_CR寄存器的HSIRDY位为只读位,当读取值为1时,表示HSI振荡器准备就绪,当HSION位被设置时,HSIRDY会自动设置为低电平。//问题标记:USART配置寄存器信息是如何与USART1/2/3建立联系的(为什么不是三个分别配置)查阅寄存器手册可知,需要配置时钟的模块有:USART1,IO port A。(2)TX配置方法(寄存器手册512页)(4)配置寄存器(寄存器手册548页)

m0_72615170的博客 1468

线程池的创建和使用

线程池复习梳理。

weixin_70496041的博客 1347

小麦病害检测系统开发

本项目旨在针对小麦病害小目标检测任务,在YOLOv11基础上进行三项改进: - 将主干网络替换为Swin Transformer,增强全局特征提取能力。 - 在检测头中引入DynamicHead,并增加检测头数量至四个,提升多尺度检测性能。 - 集成半监督FixMatch训练框架,利用无标签数据提升模型泛化能力。 我们定义五个模型进行对比实验: - Model 0: 原始YOLOv11 (有监督) - Model 1: YOLOv11 + Swin Transformer (有监督) ~~~~~~

AI的内部世界的博客 119

线程的创建方式与线程池的使用

前面几天忙着写论文好久没更新文章了,不能这么懈怠,还是得随时进行学习的反馈。虽然前面的坑还没填完,但我现在又准备开新坑了o( ̄︶ ̄)o。目前计划开个新专栏专门整理一下java.util.concurrent,Java并发包,也当做是复习,这一篇呢就是这个新系列的第一篇文章,话不多说,直接开冲!首先,如果我们直接使用JDK封装好的构造函数自动创建线程会发生什么,答案是可能由于使用无界工作队列导致任务堆积或者直接创建新的线程转发任务导致过多线程资源,发生内存溢出的问题。如果自定义合适的线程池呢?

weixin_44153131的博客 818

【2026 Science Robotics】Learning realistic lip motions for humanoid face robots

哥伦比亚大学Yuhang Hu团队提出了一种创新方法,通过10自由度软体嘴唇设计和自监督学习算法解决仿人机器人嘴唇动作僵硬问题。研究采用变分自编码器(VAE)和面部动作Transformer(FAT)模型,将语音信号转化为机器人可执行的电机指令。实验表明,该方法在多语言测试中表现优异,用户偏好率达62.5%,显著提升了口型同步的真实感和流畅度。该成果突破了传统机械结构的限制,为跨越"恐怖谷效应"提供了有效解决方案。

志在山顶的人,不会贪念山腰的风景 308

YOLOv11 快速入门指南 | 10分钟吃透网络结构与新特性

2024 年 9 月 30 日,Ultralytics 发布了 YOLOv11,这是继 YOLOv8、v9、v10 之后的最新一代实时目标检测模型。 与前几代相比,YOLOv11 在保持“单阶段、实时、端到端”三大基因的同时,带来了两大核心升级:一句话总结:YOLOv11 = 更快 + 更准 + 更少参数。 2.2 微观单元:C3k2 与 C2PSA 2.2.1 C3k2 模块 作用:替换 YOLOv8 的 C2f,做跨阶段局部特征融合。 核心代码(ultralytics/nn/modules/block

shrgegrb的博客 1407

学习使用线程池

,现在进一步学习学习。

heming20122012的专栏 911

在 AS ABAP 7.40 SP05 里把 HANA 存储过程纳入 ABAP 生命周期:AMDP 实战示例与踩坑笔记

文章摘要:AMDP(ABAP Managed Database Procedures)是SAP推出的框架,用于在ABAP中管理数据库端的存储过程或函数,特别适用于HANA数据库。它通过将数据库语言(如SQLScript)嵌入ABAP方法,实现数据处理逻辑的"下推"(code pushdown),减少应用层与数据库间的数据传输。AMDP适用于需要数据库特有能力或大规模数据处理的场景,但应优先考虑Open SQL或ABAP CDS等更简单的方案。开发时需注意数据库类型检查、参数前缀(:)等语

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 224

使用 C++11 实现的动态线程池项目学习

因为当线程池要关闭的时候,可能还有任务需要执行,我们最好让任务都执行完之后再关闭线程池,所以唤醒所有线程去任务队列中找任务执行;在上面的代码示例中,而且,即使作用域内部发生了异常,只要退出了作用域,就会自动解锁,避免了作用域异常导致解锁操作没有执行,从而阻塞所有线程;头文件定义的一个模板类,它封装了一个可调用对象(例如函数、lambda 表达式或函数对象),并提供了异步执行的能力。如此一来,线程不需要等待条件变量,只要任务队列中有任务,或者要销毁线程池,就立刻返回, 然后根据对应逻辑执行任务;

OutlierLi's Blog 1293

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

线程池使用学习总结

➢ 使用ThreadPoolTaskExecutor 时一般需配置线程池。➢ 在使用多线程方法上标注@Async时表明调用的线程池。

star_falling的博客 471

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

线程池学习使用

ThreadPoolExecutor 线程池学习使用

weixin_44877172的博客 513

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【从0到1学习Java线程池】Java线程池的简介以及使用

这是【从0到1学习Java线程池】系列文章的第 壹 篇,该系列文章总共三篇,介绍了 Java 线程池的使用以及原理,并且最后会实现一个基本的线程池。本篇文章主要介绍了 Java 线程池以及它的使用。

远航 | FIBOS.io 3785

线程池最优使用策略【Java线程池学习一】

本篇博客的主要目的是指导如何在Java中优雅的使用线程池。这篇博客的内容是截止一周前我对线程池的理解,简单说就是工作了三年的人对线程池的理解。 使用多线程的时候要注意 全局变量 和 异常处理对我以往的面试来说(一年多工作经验的时候),掌握下面的理论知识就很充足了。

小道仙的后宫 999

Java线程池ExecutorService学习和使用

线程池中有3个线程 (pool-1-thread-1、pool-1-thread-2 和 pool-1-thread-3),每个线程可以同时执行一个任务。如果需要每个任务执行之后需要返回一个结果,可以实现Callable接口并重写call方法。每个任务执行的过程包括打印任务开始的信息、模拟执行2秒、打印任务完成的信息。每个任务执行2秒,然后完成,接着线程池中的线程会继续执行等待中的任务。前3个任务会立即被分配给线程池中的3个线程并开始执行。使用一个固定大小为3的线程池来并发执行这些任务。

Dd_ddc的博客 3664

线程池的简单学习与使用

线程池的简单学习与使用线程池的实现原理ThreadPoolExecutor 线程池的实现原理 当一个新的任务提交到线程池时 线程池判断核心线程池里的线程是否都在执行任务。 否。则创建一个新的工作线程来执行任务 是。则判断工作队列是否已满 否。则将任务存储在工作队列 是。线程池判断线程池的线程是否都处于工作状态 否。则创建一个新的工作线程来执行任务 是。则交给饱和策略来处理这个任务 流程图如下: ThreadPoolExecutor 几乎所有的线程池框架都是通过**ThreadP

一只懒惰的土拨鼠的博客 603

ExecutorService基本知识点学习,不同的线程池使用场景区分

ExecutorService使用写在前面一、基本方法介绍1.1、shutdown()1.2、shutdownNow()1.3、awaitTermination(n, TimeUnit)1.4、submit()1.5、invokeAll1.6、invokeAny1.7、isTerminated()二、操作使用2.1、选择合适的线程池2.2、使用 写在前面 这里先对 ExecutorService ...

诗和远方,任重道远 968

线程池学习笔记(1)——线程池的使用

写在前面 虽然参加工作也有几年,但是很少接触多线程开发,最近碰到一个项目用到多线程,所以才开始学习,这里就记录一下学习历程,希望能和跟我一样初步学习的小伙伴一起共勉。第一篇文章主要记录理论知识,更多代码后面陆续发出来。本文主要面向对象是线程池初学者,大佬勿喷。 背景 使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程...

jinfengloveIT的博客 358

Java线程池学习和使用

CopyOnWriteArrayList实现原理概述 概述 马老师多线程视频学习总结(好记性不如烂笔头)。CopyOnWriteArrayList学习使用。

wz122330的博客 314

java线程池学习使用

java线程池学习使用java线程池介绍newCachedThreadPoolnewFixedThreadPoolnewScheduledThreadPoolnewSingleThreadExecutornewFixedThreadPool实例分析线程池终止 java线程池介绍 当有多个任务需要执行时,通常会想到使用多线程技术,但是如果维护这些线程,更好的来管理和使用这些线程很重要。java线程池如同一个工厂,可以对线程进行管理。java有四种类型的线程池,newCachedThreadPool,newFi

a2245939706的博客 157

【快速学习系列】Java线程池介绍和使用及线程池监控

Java线程池介绍和使用及线程池监控

Tuerlechat,的博客 487
上一篇: Spring Boot整合RabbitMQ之主题模式(Topic)
下一篇: 线程池ThreadPoolExecutor源码解析
~小爷.
博客等级 码龄9年 26粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值