tulip notes
首页
  • 学习笔记

    • 《Vue》
  • 踩坑日记

    • JavaScript
  • MQ
  • Nginx
  • IdentityServer
  • Redis
  • Linux
  • Java
  • SpringBoot
  • SpringCloud
  • MySql
  • docker
  • 算法与设计模式
  • 踩坑与提升
  • Git
  • GitHub技巧
  • Mac
  • 网络
  • 项目构建合集
  • 一些技巧
  • 面试
  • 一些杂货
  • 友情链接
  • 项目发布
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Star-Lord

希望一天成为大师的学徒
首页
  • 学习笔记

    • 《Vue》
  • 踩坑日记

    • JavaScript
  • MQ
  • Nginx
  • IdentityServer
  • Redis
  • Linux
  • Java
  • SpringBoot
  • SpringCloud
  • MySql
  • docker
  • 算法与设计模式
  • 踩坑与提升
  • Git
  • GitHub技巧
  • Mac
  • 网络
  • 项目构建合集
  • 一些技巧
  • 面试
  • 一些杂货
  • 友情链接
  • 项目发布
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Java基础与面向对象

  • 高级进阶

  • 并发合集

    • Java中创建线程的几种方式
    • 并发相关概念与体系图
    • 线程状态与操作系统的用户态、内核态
    • 线程中的声明与守护线程_基础
    • 程序中的幽灵错误_基础
    • JDK并发包
    • 线程池相关
    • 并发中的安全集合
    • 生产者和消费者
    • 玩转单例模式
    • 一些工具类的原理
    • 并发包中的AQS
    • ThreadLocal与JMM
    • 锁的探究
    • 线程顺序执行与等待和通知
    • 线程间通信与等待、通知机制
    • 线程池与任务调度
      • 线程池介绍
      • 核心作用与价值
        • 1. 降低资源消耗
        • 2. 提高响应速度
        • 3. 提高线程的可管理性
        • 4. 防止资源耗尽
      • Java 中的线程池体系
        • 任务调度-练习题
  • JVM合集

  • 实战细节与其他

  • 代码之丑与提升

  • 《Java》学习笔记
  • 并发合集
EffectTang
2025-08-31
目录

线程池与任务调度

# 线程池与任务调用

# 线程池介绍

线程池是 Java 并发编程中最重要的概念之一,它是一种管理和复用线程的机制,用于优化线程的使用和管理。

线程池是一种线程管理机制,它预先创建一组线程并保持它们处于就绪状态,当有任务需要执行时,从池中分配一个线程来执行任务,任务完成后线程返回池中等待下一个任务,而不是被销毁。

# 核心作用与价值

# 1. 降低资源消耗

  • 减少线程创建和销毁的开销:线程的创建和销毁需要消耗系统资源
  • 复用已有线程:避免频繁创建新线程的性能成本

# 2. 提高响应速度

  • 任务到达时立即执行:线程已预先创建好,无需等待线程创建
  • 减少启动延迟:特别适合大量短耗时任务

# 3. 提高线程的可管理性

  • 统一管理线程资源:可以控制并发数量、监控线程状态
  • 提供多种管理策略:如任务队列、拒绝策略等

# 4. 防止资源耗尽

  • 限制最大线程数:防止创建过多线程导致系统崩溃
  • 提供过载保护:通过拒绝策略处理过多任务

# Java 中的线程池体系

Java 通过 java.util.concurrent 包提供了强大的线程池支持:

// 线程池的核心接口和类
Executor          // 执行器接口
ExecutorService   // 执行服务接口(扩展了Executor)
ThreadPoolExecutor // 线程池执行器(最核心的实现)
ScheduledExecutorService // 支持调度的执行服务

// 工具类
Executors         // 线程池工厂工具类
1
2
3
4
5
6
7
8

# 任务调度-练习题

使用ScheduledThreadPoolExecutor实现一个定时任务:每5秒输出一次当前时间,并在1分钟后终止任务。

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

public class ScheduledTaskExample {
    public static void main(String[] args) throws InterruptedException {
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        ScheduledFuture<?> future = scheduler.scheduleAtFixedRate(() -> {
            System.out.println("Current Time: " + new SimpleDateFormat("HH:mm:ss").format(new Date()));
        }, 0, 5, TimeUnit.SECONDS);

        // 1分钟后终止任务
        Thread.sleep(60_000);
        future.cancel(true);
        scheduler.shutdown();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

创建了一个调度线程池,线程池大小是 1:

  • ScheduledExecutorService 是 JDK 提供的定时任务调度器;
  • Executors.newScheduledThreadPool(1) 表示只有一个线程执行定时任务。

scheduler.scheduleAtFixedRate(...)

  • 安排一个任务以**固定速率(Fixed Rate)**周期性执行。
  • 第一次延迟后开始执行,每隔固定时间间隔再次执行,无论任务执行花多少时间,间隔是相对于开始时间计算的。
  • 和 scheduleWithFixedDelay 不同,scheduleWithFixedDelay 是“执行完后延迟一段时间再执行”。

返回值:ScheduledFuture<?>

  • ScheduledFuture 是一个可以代表未来执行结果的句柄。
  • 通过 future.cancel(true) 可以取消任务。
  • 泛型 <?> 表示任务没有返回结果(因为 Runnable 没有返回值)。
上次更新: 2025/08/31, 14:50:15
线程间通信与等待、通知机制
JVM的作用跟字节码

← 线程间通信与等待、通知机制 JVM的作用跟字节码→

最近更新
01
Spring中Bean的生命周期
09-03
02
数据不丢失与准确类
09-01
03
线程间通信与等待、通知机制
08-23
更多文章>
Theme by Vdoing | Copyright © 2023-2025 EffectTang
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式