java中线程池的用法
时间: 2025-05-29 12:52:39 浏览: 18
### Java 中线程池的使用方法及示例代码
Java 中的线程池主要用于管理和重用线程资源,从而提高应用程序的性能和响应速度。以下是关于线程池的具体实现方式及相关示例代码。
#### 一、线程池的核心概念
线程池的主要目的是减少每次创建新线程所带来的开销,并允许更高效地管理并发任务。核心组件包括 `Executor` 接口及其子接口 `ExecutorService`,以及具体的实现类如 `ThreadPoolExecutor` 和一些便捷工厂方法(如 `Executors.newFixedThreadPool()` 等)[^1]。
---
#### 二、常用的线程池类型及其实现
##### 2.1 FixedThreadPool
此线程池具有固定的线程数量,超出的任务会被放入队列中等待执行。
```java
// 创建一个固定大小为3的线程池
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 5; i++) {
final int taskNumber = i;
fixedThreadPool.execute(() -> {
System.out.println("Task " + taskNumber + " is running on thread " + Thread.currentThread().getName());
});
}
fixedThreadPool.shutdown(); // 关闭线程池
```
这种方式适用于需要严格控制并发线程数的情况[^2]。
---
##### 2.2 CachedThreadPool
此类线程池会根据需要动态创建新的线程,但在空闲时会回收未使用的线程。
```java
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int taskIndex = i;
cachedThreadPool.submit(() -> {
try {
Thread.sleep(100); // 模拟耗时操作
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("Executing Task " + taskIndex);
});
}
cachedThreadPool.shutdown();
```
适合短生命周期的小型任务场景。
---
##### 2.3 SingleThreadExecutor
仅有一个工作线程,按顺序依次执行提交的任务。
```java
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
singleThreadExecutor.submit(() -> System.out.println("First Task"));
singleThreadExecutor.submit(() -> System.out.println("Second Task"));
singleThreadExecutor.shutdown();
```
常用于串行化任务处理。
---
##### 2.4 ScheduledThreadPool
能够安排命令在未来某个时刻执行,也可以周期性地重复执行某项任务。
```java
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);
scheduledThreadPool.schedule(() -> System.out.println("Delayed Task"), 2, TimeUnit.SECONDS);
scheduledThreadPool.scheduleAtFixedRate(() -> {
System.out.println("Periodic Task at " + LocalDateTime.now());
}, 0, 1, TimeUnit.SECONDS);
scheduledThreadPool.shutdown();
```
对于定时任务非常有用。
---
##### 2.5 WorkStealingPool (JDK 1.8 新增)
利用 ForkJoinPool 技术实现的工作窃取算法,旨在最大化 CPU 利用率。
```java
ExecutorService workStealingPool = Executors.newWorkStealingPool();
IntStream.rangeClosed(1, 5).forEach(i -> {
workStealingPool.submit(() -> {
System.out.println("Task-" + i + " executed by " + Thread.currentThread().getName());
});
});
workStealingPool.shutdown();
```
推荐在高吞吐量计算密集型环境中采用。
---
#### 三、手动创建线程池 (`ThreadPoolExecutor`)
如果默认提供的几种线程池无法完全满足业务需求,则可通过 `ThreadPoolExecutor` 自定义更多细节参数。
```java
ThreadPoolExecutor customThreadPool = new ThreadPoolExecutor(
2, // 核心线程数 corePoolSize
4, // 最大线程数 maximumPoolSize
60L, // 空闲线程存活时间 keepAliveTime
TimeUnit.SECONDS, // 时间单位 unit
new LinkedBlockingQueue<>(100)); // 任务队列 queue
customThreadPool.execute(() -> System.out.println("Custom Pool Example"));
customThreadPool.shutdown();
```
通过调整这些参数可以灵活应对各种复杂情况。
---
### 总结
以上分别介绍了五种典型的线程池类型及其适用范围,并提供了相应的代码片段帮助理解其基本用法。合理选用合适的线程池有助于优化系统的整体表现。
阅读全文
相关推荐


















