Java 自己实现一个线程池
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class MyThreadPool {
private final int nThreads;
private final PoolWorker[] threads;
private final BlockingQueue<Runnable> queue;
public MyThreadPool(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();
}
}
public void shutdown() {
for (PoolWorker worker : threads) {
worker.shutdown();
}
}
private class PoolWorker extends Thread {
private boolean running = true;
public void run() {
while (running) {
Runnable task = null;
synchronized (queue) {
while (queue.isEmpty()) {
try {
queue.wait();
} catch (InterruptedException e) {
System.out.println("An error occurred while queue is waiting: " + e.getMessage());
}
}
task = queue.poll();
}
try {
task.run();
} catch (RuntimeException e) {
System.out.println("Thread pool is interrupted due to an issue: " + e.getMessage());
}
}
}
public void shutdown() {
running = false;
}
}
}
在这个实现中,首先创建了一个任务队列BlockingQueue,用于存储待执行的任务。然后创建了一定数量的工作线程PoolWorker,这些线程不断从任务队列中获取任务并执行。
在执行任务时,如果任务队列中没有任务,则工作线程会调用wait()方法等待新任务的到来。当有新任务加入队列时,工作线程调用notify()方法唤醒其中一个等待线程,并从队列中取出任务执行。
在MyThreadPool中,通过execute()方法将任务添加到任务队列中,而通过shutdown()方法关闭线程池。其中,PoolWorker类继承自Thread类,实现了运行线程和关闭线程的方法。
需要注意的是,这个实现中只是一个简单的线程池,还有很多需要完善的地方,例如线程池大小的动态调整、线程的回收等等。此外,在实际应用中,为了更好的线程安全和性能,建议使用Java中提供的线程池类Executors,而不是自己实现线程池。
下一篇:
java基础语法之运算符和语句
