以下是一个简单的Java线程池的实现:
```java
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class ThreadPool {
private final int nThreads;
private final PoolWorker[] threads;
private final BlockingQueue<Runnable> queue;
public ThreadPool(int nThreads) {
this.nThreads = nThreads;
queue = new LinkedBlockingQueue<>();
threads = new PoolWorker[nThreads];
for (int i = 0; i < nThreads; i++) {
threads[i] = new PoolWorker();
threads[i].start();
}
}
public void execute(Runnable task) {
synchronized (queue) {
queue.add(task);
queue.notify();
}
}
private class PoolWorker extends Thread {
public void run() {
Runnable task;
while (true) {
synchronized (queue) {
while (queue.isEmpty()) {
try {
queue.wait();
} catch (InterruptedException e) {
System.out.println("An error occurred while waiting for a task: " + e.getMessage());
}
}
task = queue.poll();
}
try {
task.run();
} catch (RuntimeException e) {
System.out.println("An error occurred while executing a task: " + e.getMessage());
}
}
}
}
}
```
这个线程池实现了一个固定大小的线程池,可以执行传入的Runnable任务。在主函数中,我们创建了一个线程池并提交了一些任务:
```java
public static void main(String[] args) {
ThreadPool pool = new ThreadPool(5);
for (int i = 0; i < 10; i++) {
final int taskNum = i;
pool.execute(() -> {
System.out.println("Task " + taskNum + " is running.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Task " + taskNum + " is done.");
});
}
}
```
输出结果如下:
```
Task 0 is running.
Task 1 is running.
Task 2 is running.
Task 3 is running.
Task 4 is running.
Task 0 is done.
Task 5 is running.
Task 1 is done.
Task 6 is running.
Task 2 is done.
Task 7 is running.
Task 3 is done.
Task 8 is running.
Task 4 is done.
Task 9 is running.
Task 5 is done.
Task 6 is done.
Task 7 is done.
Task 8 is done.
Task 9 is done.
```