线程池与任务调度
# 线程池与任务调用
# 线程池介绍
线程池是 Java 并发编程中最重要的概念之一,它是一种管理和复用线程的机制,用于优化线程的使用和管理。
线程池是一种线程管理机制,它预先创建一组线程并保持它们处于就绪状态,当有任务需要执行时,从池中分配一个线程来执行任务,任务完成后线程返回池中等待下一个任务,而不是被销毁。
# 核心作用与价值
# 1. 降低资源消耗
- 减少线程创建和销毁的开销:线程的创建和销毁需要消耗系统资源
- 复用已有线程:避免频繁创建新线程的性能成本
# 2. 提高响应速度
- 任务到达时立即执行:线程已预先创建好,无需等待线程创建
- 减少启动延迟:特别适合大量短耗时任务
# 3. 提高线程的可管理性
- 统一管理线程资源:可以控制并发数量、监控线程状态
- 提供多种管理策略:如任务队列、拒绝策略等
# 4. 防止资源耗尽
- 限制最大线程数:防止创建过多线程导致系统崩溃
- 提供过载保护:通过拒绝策略处理过多任务
# Java 中的线程池体系
Java 通过 java.util.concurrent
包提供了强大的线程池支持:
// 线程池的核心接口和类
Executor // 执行器接口
ExecutorService // 执行服务接口(扩展了Executor)
ThreadPoolExecutor // 线程池执行器(最核心的实现)
ScheduledExecutorService // 支持调度的执行服务
// 工具类
Executors // 线程池工厂工具类
1
2
3
4
5
6
7
8
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
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