如何实现一个简单的线程池?
时间: 2024-09-24 12:20:23 浏览: 35
用Python实现一个简单的线程池
实现一个简单的线程池通常涉及到以下几个步骤:
1. **创建工作队列**:这是线程池的核心部分,用于存储等待执行的任务。可以选择`BlockingQueue`,如`ArrayBlockingQueue`或`LinkedBlockingQueue`,它们提供公平的阻塞获取任务的能力。
```java
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();
```
2. **线程工人**:这是一组可以独立执行任务的线程,从队列中取出任务并执行。你可以使用`ThreadFactory`创建新的线程,并通过`Executors`工具类创建固定大小的线程池。
```java
ExecutorService executor = Executors.newFixedThreadPool(poolSize, new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
// 设置线程名称或其他属性
return thread;
}
});
```
3. **提交任务**:将任务提交到工作队列,由线程工人处理。`execute()`方法可用于此目的。
```java
executor.execute(() -> {
// 任务代码
});
```
4. **关闭线程池**:当不再需要线程池时,记得调用`shutdown()`方法停止接收新任务,然后使用`awaitTermination()`等待所有任务完成。
```java
executor.shutdown();
while (!executor.isTerminated()) {}
```
简单线程池示例:
```java
final int POOL_SIZE = 5;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();
ExecutorService executor = Executors.newFixedThreadPool(POOL_SIZE, new ThreadFactory() {
// 线程工厂实现...
});
// 提交任务
for (int i = 0; i < 10; i++) {
Runnable task = () -> {
System.out.println(Thread.currentThread().getName() + " running task " + i);
};
executor.execute(task);
}
// 关闭线程池
executor.shutdown();
```
阅读全文