/** Removes the SimpleTimer. */ public void removeSimpleTimer() { synchronized (_events) { runn.setAnswer(false); _events.clear(); _eventTimes.clear(); _events.notifyAll(); } synchronized (_readyEvents) { _readyEvents.clear(); _readyEvents.notifyAll(); } }
/** * @param event * @param timeoutMs * @param useEarliestTime if its already scheduled, use the earlier of the two timeouts, else use * the later */ public void addEvent(TimedEvent event, long timeoutMs, boolean useEarliestTime) { int totalEvents = 0; long now = System.currentTimeMillis(); long eventTime = now + timeoutMs; Long time = Long.valueOf(eventTime); synchronized (_events) { // remove the old scheduled position, then reinsert it Long oldTime = _eventTimes.get(event); if (oldTime != null) { if (useEarliestTime) { if (oldTime.longValue() < eventTime) { _events.notifyAll(); return; // already scheduled for sooner than requested } else { _events.remove(oldTime); } } else { if (oldTime.longValue() > eventTime) { _events.notifyAll(); return; // already scheduled for later than the given period } else { _events.remove(oldTime); } } } // FIXME if you plan to use this class again while (_events.containsKey(time)) time = Long.valueOf(time.longValue() + 1); _events.put(time, event); _eventTimes.put(event, time); if ((_events.size() != _eventTimes.size())) { _log.error("Skewed events: " + _events.size() + " for " + _eventTimes.size()); for (TimedEvent evt : _eventTimes.keySet()) { Long when = _eventTimes.get(evt); TimedEvent cur = _events.get(when); if (cur != evt) { _log.error("event " + evt + " @ " + when + ": " + cur); } } } totalEvents = _events.size(); _events.notifyAll(); } if (time.longValue() > eventTime + 100) { if (_log.shouldLog(Log.WARN)) _log.warn( "Lots of timer congestion, had to push " + event + " back " + (time.longValue() - eventTime) + "ms (# events: " + totalEvents + ")"); } long timeToAdd = System.currentTimeMillis() - now; if (timeToAdd > 50) { if (_log.shouldLog(Log.WARN)) _log.warn( "timer contention: took " + timeToAdd + "ms to add a job with " + totalEvents + " queued"); } }