ExecutorService exec线程池限制线程数量
时间: 2023-05-30 08:03:02 浏览: 225
ExecutorService可以通过ThreadPoolExecutor来创建线程池,其中可以设置核心线程数、最大线程数、等待队列大小等参数来限制线程数量。
例如,以下代码创建了一个线程池,其中核心线程数为5,最大线程数为10,等待队列大小为100:
```java
ExecutorService exec = new ThreadPoolExecutor(5, 10, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(100));
```
这个线程池最多只能同时运行10个线程,超过10个线程的任务会被放入等待队列中,等待队列满了之后再创建新的线程,直到达到最大线程数为止。如果等待队列和最大线程数都满了,新的任务就会被拒绝执行。
相关问题
java、线程池的用法
### Java 中线程池的使用方法
#### 使用 `Executors` 工具类创建线程池
通过 `Executors` 类可以方便快捷地创建不同类型的线程池。以下是几种常见的线程池类型:
- **固定大小线程池**:适用于负载较重的任务,能控制并发数量。
```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class FixedThreadPoolExample {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(10);
for (int i = 0; i < 100; ++i) {
Runnable worker = new WorkerThread("" + i);
executor.execute(worker); // 提交任务给线程池执行
}
executor.shutdown(); // 关闭线程池
}
static class WorkerThread implements Runnable {
private String command;
public WorkerThread(String s){
this.command = s;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " Start. Command = "
+ command);
processCommand();
System.out.println(Thread.currentThread().getName() + " End.");
}
protected void processCommand(){
try{
Thread.sleep(500);
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
```
- **缓存型线程池**:适合执行大量的短期异步任务。
```java
ExecutorService cachedPool = Executors.newCachedThreadPool();
cachedPool.submit(() -> System.out.println("Task executed"));
```
- **单一线程池**:仅有一个工作线程,按顺序处理提交的任务。
```java
ExecutorService singlePool = Executors.newSingleThreadExecutor();
singlePool.submit(() -> System.out.println("Executing task sequentially"));
```
#### 手动构建自定义线程池
当默认配置无法满足需求时,可以通过 `ThreadPoolExecutor` 来手动定制更复杂的线程池设置[^3]。
```java
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
// 定义拒绝策略处理器
RejectedExecutionHandler handler = (r, exec) -> {
if (!exec.isShutdown()) {
try {
exec.getQueue().put(r);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
}
};
// 自定义线程工厂
ThreadFactory factory = r -> {
Thread t = new Thread(r);
t.setDaemon(true); // 设置守护进程
return t;
};
// 创建 ThreadPoolExecutor 实例
ThreadPoolExecutor pool = new ThreadPoolExecutor(
2, // 核心线程数
4, // 最大线程数
60L, // 空闲时间
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(10), // 队列容量
factory, // 线程工厂
handler // 拒绝策略
);
pool.submit(() -> System.out.println("Customized thread pool execution"));
// 记得关闭线程池以释放资源
pool.shutdown();
```
#### 处理未捕获异常的最佳实践
由于多线程环境中直接在子线程内抛出的异常不会传播至主线程,在设计程序逻辑时应考虑如何妥善处理这些潜在错误情况。一种常见做法是在实现 `Runnable` 或者 `Callable` 接口时加入适当的异常捕捉机制,并记录日志以便后续排查问题[^2]。
```java
@Override
public void run() {
try {
// 正常业务逻辑...
} catch (ArithmeticException ex) {
logger.error("An arithmetic exception occurred", ex);
} catch (Throwable th) {
logger.error("Unexpected error encountered", th);
}
}
```
阅读全文
相关推荐













