corePoolSize = 5
(核心线程数)。maxPoolSize = 10
(最大线程数)。queueCapacity = 20
(队列容量)。线程池的最大任务处理能力为:
corePoolSize + queueCapacity + (maxPoolSize - corePoolSize)
= 5 + 20 + (10 - 5)
= 30
这意味着线程池最多可以同时处理 30 个批次 的任务。
假设每批次处理时间为 2 分钟,那么每个线程每 2 分钟可以完成一个批次的任务。因此,线程池的实际吞吐量取决于线程数量:
如果任务提交速度过快(例如一次性提交所有批次),可能会导致任务堆积甚至触发拒绝策略。
为了避免任务堆积和拒绝策略触发,可以采取以下措施:
@Service
public class DataProcessingService {
@Autowired
private TaskExecutor taskExecutor;
public void processDataInBatches() {
int batchSize = 100; // 每批次处理的数据量
int totalRecords = 10000; // 总记录数
int totalPages = (int) Math.ceil((double) totalRecords / batchSize);
for (int i = 0; i < totalPages; i++) {
int offset = i * batchSize;
List<DataEntity> batchData = fetchDataBatch(offset, batchSize);
// 提交任务到线程池
taskExecutor.execute(() -> processBatch(batchData));
// 控制任务提交速度
if ((i + 1) % 5 == 0) { // 每提交 5 个批次后等待 2 分钟
try {
Thread.sleep(2 * 60 * 1000); // 等待 2 分钟
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
private List<DataEntity> fetchDataBatch(int offset, int limit) {
// 数据库查询逻辑
return new ArrayList<>();
}
private void processBatch(List<DataEntity> batchData) {
// 数据处理逻辑
}
}
queueCapacity
从 20 增加到 100)。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。