自己实现一个线程池,要求如下:可以设置工作线程数量,若可用线程数不为0,则提交的任务直接使用工作线程执行;若工作线程全部在忙,则将任务放入队列中等待线程空闲后继续执行;若队列也满了,则调用拒绝策略。 (请写明编码思路,比如通过哪个类或者方法实现某个需求,思路占5分)
时间: 2024-10-18 14:11:17 浏览: 43
实现一个简单的线程池,我们可以考虑使用Java的`ExecutorService`和`ThreadPoolExecutor`类,它们提供了一个管理固定数量线程执行任务的能力。以下是基本的编码思路:
1. **创建核心线程池**:
- 创建一个`ThreadPoolExecutor`实例,指定核心线程数量(即最小线程数),这是始终启动并运行的线程数。这可以用`new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)`构造函数实现。
- 设置`corePoolSize`为你希望的工作线程数量,`maximumPoolSize`通常设得稍大一些,以便处理高峰期的任务,`keepAliveTime`是线程空闲时间,超过这个时间会被回收。
2. **任务提交和执行**:
- 使用`execute()`方法提交任务到线程池。如果线程池中有可用的线程,任务会立即执行;如果没有可用线程,任务会被添加到工作队列`workQueue`中。
3. **控制队列大小**:
- 如果工作队列已满,你可以选择不同的阻塞策略,例如`Synchronous`(默认)表示抛出异常,`DiscardOldestPolicy`表示丢弃最旧的任务,或者自定义策略。
4. **拒绝策略**:
- 当工作队列已满且无空闲线程时,`ThreadPoolExecutor`提供了多种拒绝策略:
- `AbortPolicy`:默认策略,抛出`RejectedExecutionException`异常。
- `CallerRunsPolicy`:任务被提交者自身执行。
- `DiscardPolicy`:忽略任务。
- `DiscardOldestPolicy`:丢弃队列中最老的任务。
5. **关闭线程池**:
- 提供一个`shutdown()`或`shutdownNow()`方法来停止接收新的任务,让当前运行的任务完成后关闭。
下面是一个简化版的线程池实现示例(注意这只是一个基础版本,未包含异常处理和定制化拒绝策略):
```java
import java.util.concurrent.*;
public class CustomThreadPool {
private final ExecutorService executor;
public CustomThreadPool(int corePoolSize) {
this.executor = new ThreadPoolExecutor(
corePoolSize,
Integer.MAX_VALUE, // maximumPoolSize for infinite tasks queue
0L, // keepAliveTime for idle threads to wait before being terminated
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>()
);
}
public void execute(Runnable task) {
executor.execute(task);
}
// Close the pool when no longer needed
public void shutdown() {
executor.shutdown();
}
}
```
阅读全文