在Java中,线程池的实现主要依赖于`java.util.concurrent`包下的`Executor`接口及其子接口`ExecutorService`,以及`ThreadPoolExecutor`等具体实现类。以下是Java线程池的多种实现方式及示例:
使用Executors工厂类
`Executors`工厂类提供了几种快速创建线程池的方法:
newFixedThreadPool:
创建一个固定大小的线程池。
```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class FixedThreadPoolExample {
public static void main(String[] args) {
// 创建一个固定大小为3的线程池
ExecutorService executor = Executors.newFixedThreadPool(3);
// 提交任务给线程池执行
for (int i = 0; i < 10; i++) {
int taskId = i;
executor.execute(System.out::println, "Task " + taskId + " is running on " + Thread.currentThread().getName());
}
// 关闭线程池
executor.shutdown();
}
}
```
newCachedThreadPool:
创建一个可缓存的线程池,线程数量不固定,根据任务自动调整。
```java
ExecutorService executor = Executors.newCachedThreadPool();
```
newSingleThreadExecutor:
创建一个只有一个线程的池子,任务按顺序执行。
```java
ExecutorService executor = Executors.newSingleThreadExecutor();
```
newScheduledThreadPool:
创建一个定时任务线程池。
```java
ExecutorService executor = Executors.newScheduledThreadPool(5);
```
使用ThreadPoolExecutor
`ThreadPoolExecutor`是`ExecutorService`的一个具体实现类,可以更灵活地配置线程池的行为。
```java
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExecutorExample {
public static void main(String[] args) {
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
5, // 核心线程数
10, // 最大线程数
60L, // 空闲线程存活时间
TimeUnit.SECONDS, // 时间单位
new ArrayBlockingQueue ); // 提交任务给线程池执行 for (int i = 0; i < 10; i++) { int taskId = i; threadPool.execute(() -> System.out.println("Task " + taskId + " is running on " + Thread.currentThread().getName())); } // 关闭线程池 threadPool.shutdown(); } } ``` 自定义线程池 如果需要更高级的配置,可以直接使用`ThreadPoolExecutor`类来创建线程池。 ```java import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class CustomThreadPoolExample { public static void main(String[] args) { ThreadPoolExecutor threadPool = new ThreadPoolExecutor( Runtime.getRuntime().availableProcessors() + 1, // 核心线程数 Runtime.getRuntime().availableProcessors() * 2, // 最大线程数 60L, // 空闲线程存活时间 TimeUnit.MILLISECONDS, // 时间单位 new ArrayBlockingQueue ); // 提交任务给线程池执行 for (int i = 0; i < 10; i++) { int taskId = i; threadPool.execute(() -> System.out.println("Task " + taskId + " is running on " + Thread.currentThread().getName())); } // 关闭线程池 threadPool.shutdown(); } } ``` 总结 Java提供了多种线程池的实现方式,可以根据不同的场景选择合适的线程池类型。`Executors`工厂类提供了简单易用的方法来创建常见的线程池,而`ThreadPoolExecutor`则提供了更灵活的配置选项。在实际开发中,可以根据任务类型和性能需求选择合适的线程池实现。