实现一个线程池,若可用线程数不为0则提交的线程直接使用工作线程执行,若工作线程全部在忙则任务放入队列中等待线程空闲后执行,若队列也满了,则拒绝调用
时间: 2024-10-18 20:06:50 浏览: 26
通用多线程模块(jdk线程池的运用)
为了实现这样的线程池,你可以使用Java的`ExecutorService`框架,特别是`ThreadPoolExecutor`类。这里是一个简单的示例:
```java
import java.util.concurrent.*;
public class ThreadPool {
private final ExecutorService executor;
private final BlockingQueue<Runnable> workQueue;
public ThreadPool(int corePoolSize, int maximumPoolSize, TimeUnit unit) {
this.executor = new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
unit,
TimeUnit.SECONDS,
workQueue = new LinkedBlockingQueue<>(maximumPoolSize),
r -> new Thread(r, "Worker")
);
}
public void execute(Runnable task) {
try {
if (executor.getActiveCount() < corePoolSize || !workQueue.offer(task)) { // 空闲或者队列未满
executor.execute(task);
} else {
System.out.println("Task rejected due to queue full.");
}
} catch (RejectedExecutionException e) {
// 当线程已满且队列已满时,捕获异常并处理
e.printStackTrace();
}
}
public void shutdown() {
executor.shutdown();
}
}
```
在这个实现中,`execute()`方法检查当前活跃的线程数量是否小于核心线程数或工作队列是否为空。如果满足条件,就将任务直接提交给执行器;如果不满足,任务会被添加到队列中。如果队列满了,`offer()`方法会抛出`RejectedExecutionException`,我们捕获该异常并打印一条消息。
阅读全文