Java线程池的线程执行策略
发布时间: 2024-01-19 23:33:53 阅读量: 38 订阅数: 41
# 1. 简介
## 1.1 什么是线程池
线程池是一种管理和复用线程的机制。它包含一个线程集合,可以调度提交的任务给线程执行。在任务执行完毕后,线程可以返回线程池中继续执行其他任务,而不是销毁并重新创建线程。
## 1.2 为什么需要线程池
在很多应用场景中,需要同时处理多个任务,而每个任务的处理时间可能不同。如果为每个任务都创建一个新线程,会导致线程数量过多,消耗大量的系统资源。而线程池可以重用线程,减少线程创建和销毁的开销,提高系统的性能和资源利用率。
## 1.3 Java中的线程池类及其常用方法
Java提供了一个ThreadPoolExecutor类来实现线程池的功能。它是ExecutorService接口的实现类,并且提供了丰富的方法来管理和控制线程池的行为和属性。
常用的ThreadPoolExecutor类方法包括:
- `execute(Runnable task)`: 提交一个任务到线程池执行。
- `submit(Callable<T> task)`: 提交一个可返回结果的任务到线程池执行,并返回一个表示该任务的未来结果的Future对象。
- `shutdown()`: 优雅地关闭线程池,等待所有已提交的任务执行完毕。
- `shutdownNow()`: 强制关闭线程池,立即停止所有任务的执行,并返回尚未执行的任务列表。
- `getActiveCount()`: 获取线程池中正在执行任务的线程数量。
- `getCompletedTaskCount()`: 获取已完成执行的任务数量。
- `getTaskCount()`: 获取线程池已执行和未执行的总任务数量。
- `getQueue()`: 获取线程池中等待执行的任务队列。
# 2. 线程池的创建与使用
在前面的章节中,我们已经了解到线程池的概念和作用。本章将详细介绍如何创建和使用线程池。首先,我们需要了解如何创建一个线程池对象。
#### 2.1 如何创建线程池
Java提供了`ThreadPoolExecutor`类来创建线程池。一般通过`Executors`工具类中的静态方法来创建线程池对象,下面是创建线程池的几种常用方法:
1. `newFixedThreadPool(int nThreads)`:创建一个固定大小的线程池,线程池中的线程数固定为`nThreads`。
2. `newCachedThreadPool()`:创建一个可缓存的线程池,线程池中的线程数根据任务数量自动调整。
3. `newSingleThreadExecutor()`:创建一个单线程的线程池,只有一个线程在执行任务。
4. `newScheduledThreadPool(int corePoolSize)`:创建一个定时执行任务的线程池,可以指定线程池中的核心线程数。
下面是使用`newFixedThreadPool()`方法创建一个固定大小的线程池的示例代码:
```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolDemo {
public static void main(String[] args) {
// 创建线程池
ExecutorService threadPool = Executors.newFixedThreadPool(5);
// 提交任务到线程池
for (int i = 0; i < 10; i++) {
final int taskNum = i;
threadPool.execute(() -> {
System.out.println("正在执行任务 " + taskNum);
// 任务逻辑代码
});
}
// 关闭线程池
threadPool.shutdown();
}
}
```
#### 2.2 设置线程池的属性
创建线程池后,我们还可以通过设置线程池的属性来满足不同的需求。线程池的属性包括核心线程数、最大线程数、线程空闲时间、任务队列等。
1. `corePoolSize`:线程池的核心线程数,线程池会一直保持这个核心线程数的线程在运行状态。
2. `maximumPoolSize`:线程池允许的最大线程数,超过核心线程数后,空闲线程的存活时间由`keepAliveTime`决定。
3. `keepAliveTime`:线程空闲时间,当线程池中的线程数超过核心线程数时,空闲线程的存活时间超过这个时间后,会被回收。
4. `unit`:存活时间的时间单位。
5. `workQueue`:等待执行的任务队列,有多种实现方式可选择,例如`ArrayBlockingQueue`、`LinkedBlockingQueue`等。
下面是设置线程池属性的示例代码:
```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class ThreadPoolDemo {
public static void main(String[] args) {
// 创建线程池
ExecutorService threadPool = new ThreadPoolExecutor(
5, // corePoolSize
10, // maximumPoolSize
60, // keepAliveTime
TimeUnit.SECONDS, // unit
new ArrayBlockingQueue<>(100) // workQueue
);
// 提交任务到线程池
for (int i = 0; i < 10; i++) {
final int taskNum = i;
threadPool.execute(() -> {
System.out.println("正在执行任务 " + taskNum);
// 任务逻辑代码
});
}
// 关闭线程池
threadPool.s
```
0
0