假设我在应用程序中定义了很多计时器。
@Startup
@Singleton
public class ScheduleManager {
@Resource
TimerService timerService;
Map<Long, Timer> timerMap;
@PostConstruct
void init() {
timerMap = new HashMap<>();
for (int i = 0; i < 10; i++) {
TimerConfig tc = new TimerConfig("someEntityId", true);
Timer timer = timerService.createSingleActionTimer(new Date(TimeUnit.DAYS.toMillis(i)), tc);
timerMap.put((long) i, timer);
}
}
public void cancelTimerById(long i) {
Timer timer = timerMap.get(i);
if(timer != null) {
timerMap.remove(i); //release the reference from Map
timer.cancel();
}
}
}
取消这样的计时器是否安全/可能?
其他解决方案是:
public void cancelTimerById(long i) {
for(Timer timer : timerService.getTimers()) {
if(Long.valueOf(timer.getInfo().toString()).equals(i)) {
timer.cancel();
}
}
}
但是对于每次取消来说这都是一个太多的迭代......
我担心的是在地图中保留singleActionTimers(或其他定期计时器)的实例。 (用于GC清理)。
由于