将计时器实例存储在地图中是否安全?

时间:2015-06-23 08:55:40

标签: java java-ee timer ejb

假设我在应用程序中定义了很多计时器。

@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清理)。

由于

0 个答案:

没有答案