java面试:怎么创建自定义线程池
时间: 2024-10-24 08:04:35 浏览: 28
Java 133道面试题(包括答案 JAVA面试必备)
在Java中创建自定义线程池通常涉及到`ExecutorService`框架,它提供了一种更高级的方式来管理并发任务。这里我们介绍如何使用`ThreadPoolExecutor`,这是一个功能强大的线程池类,允许自定义线程数、队列策略以及拒绝策略。
以下是创建自定义线程池的基本步骤:
1. **导入所需的包**:
```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
```
2. **创建固定大小线程池** (例如5个线程) :
```java
ExecutorService executor = Executors.newFixedThreadPool(5);
```
3. **创建可缓存线程池** (线程数根据需要动态调整) :
```java
ExecutorService executor = Executors.newCachedThreadPool();
```
4. **设置定长工作队列和最大线程数**:
```java
int corePoolSize = 10; // 核心线程数
int maximumPoolSize = 20; // 最大线程数
ExecutorService executor = new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize, // 空闲线程存活时间
60L, // 阻塞等待超时时间
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(maximumPoolSize)); // 定义队列容量
```
5. **提交任务**:
```java
executor.submit(Runnable task); // Runnable接口的任务
executor.executeCallable(Callable task); // Callable接口的任务,返回值可以获取
```
6. **关闭线程池**:
```java
executor.shutdown(); // 可以继续接收任务,但不会新分配线程
executor.shutdownNow(); // 立即停止接受新的任务,并尝试让当前的任务尽快完成
try {
if (!executor.awaitTermination(1, TimeUnit.MINUTES)) {
System.err.println("Pool did not terminate");
}
} catch (InterruptedException e) {
executor.shutdownNow();
}
```
阅读全文