线程池实现定时任务,但需要实现执行次数限制,需要一个计数器java实现
时间: 2024-10-23 16:08:49 浏览: 13
代码_单片机定时器/计数器设计一个秒表_proteus实现秒表_
5星 · 资源好评率100%
在Java中,我们可以利用`ScheduledExecutorService`结合`ScheduledFuture`以及一个线程安全的计数器来实现线程池中的定时任务,同时限制执行次数。这里有一个基本的示例:
```java
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
public class TaskWithLimitedExecution {
private static final AtomicInteger COUNT_DOWN = new AtomicInteger(Integer.MAX_VALUE); // 初始化最大执行次数
private static final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
public static void main(String[] args) {
int maxRuns = 5; // 设置最大执行次数
executeTask(maxRuns);
}
public static ScheduledFuture<?> executeTask(int maxRuns) {
COUNT_DOWN.set(maxRuns - 1); // 准备开始执行
return executor.scheduleAtFixedRate(() -> {
try {
if (!COUNT_DOWN.decrementAndGet() >= 0) { // 当计数器为负或等于0时停止任务
executor.shutdownNow(); // 关闭线程池,防止无限循环
} else {
// 定时任务的业务逻辑
System.out.println("执行任务,剩余次数:" + COUNT_DOWN.get());
}
} catch (Exception e) {
// 异常处理
e.printStackTrace();
}
}, 0, 1, TimeUnit.SECONDS); // 每秒执行一次
}
}
```
在这个例子中,我们首先创建一个全局的`AtomicInteger`来作为计数器,然后在`executeTask`方法中设置初始值为最大执行次数减一。每当定时任务执行完毕后,计数器减一,如果计数器变为负数或者零,就关闭线程池,终止任务执行。
阅读全文