java 手写线程池
时间: 2023-10-17 08:31:57 浏览: 58
要手写一个简单的线程池,你可以按照以下步骤进行:
1. 创建一个任务队列,用于存储待执行的任务。
2. 创建一个固定数量的线程池,用于执行任务。
3. 每当有任务提交到线程池时,将任务添加到任务队列中。
4. 线程池中的每个线程会不断从任务队列中获取任务并执行。
5. 执行完一个任务后,线程继续从任务队列中获取下一个任务,并重复执行,直到任务队列为空。
下面是一个简单的 Java 代码示例:
```java
import java.util.LinkedList;
import java.util.Queue;
public class ThreadPool {
private final int poolSize;
private final WorkerThread[] workerThreads;
private final Queue<Runnable> taskQueue;
public ThreadPool(int poolSize) {
this.poolSize = poolSize;
this.taskQueue = new LinkedList<>();
this.workerThreads = new WorkerThread[poolSize];
for (int i = 0; i < poolSize; i++) {
workerThreads[i] = new WorkerThread();
workerThreads[i].start();
}
}
public void submit(Runnable task) {
synchronized (taskQueue) {
taskQueue.add(task);
taskQueue.notify(); // 唤醒等待的线程
}
}
private class WorkerThread extends Thread {
@Override
public void run() {
while (true) {
Runnable task;
synchronized (taskQueue) {
while (taskQueue.isEmpty()) {
try {
taskQueue.wait(); // 等待新任务的到来
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
task = taskQueue.poll();
}
try {
task.run(); // 执行任务
} catch (RuntimeException e) {
// 异常处理
}
}
}
}
// 使用示例
public static void main(String[] args) {
ThreadPool threadPool = new ThreadPool(5);
for (int i = 0; i < 10; i++) {
final int index = i;
threadPool.submit(() -> {
System.out.println("Task " + index + " is running.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("Task " + index + " is complete.");
});
}
}
}
```
上述代码中,首先创建了一个任务队列 `taskQueue`,用于存储待执行的任务。然后创建了固定数量的线程池 `workerThreads`,每个线程会不断从任务队列中获取任务并执行。`ThreadPool` 类提供了 `submit` 方法,用于向线程池提交任务。
在 `main` 方法中,我们创建了一个大小为 5 的线程池,并向线程池提交了 10 个任务,每个任务会打印一段文字,并睡眠一秒钟模拟执行任务的耗时。你可以根据实际需求调整线程池的大小和任务的数量。