All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jgroups.util.TimeService Maven / Gradle / Ivy

package org.jgroups.util;

import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Provides a coarse grained time service. Registers a timer task which calls and caches {@link System#nanoTime()}
 * and returns the cached value. This is way faster than calling {@link System#nanoTime()} many times, e.g.
 * for each received message. The granularity (interval) can be chosen by the user.

* Note that use of values returned by {@link #timestamp()} needs to obey the same rules as for {@link System#nanoTime()} * @author Bela Ban * @since 3.5 */ public class TimeService implements Runnable { protected TimeScheduler timer; protected Future task; protected long interval=500; // ms protected volatile long timestamp=System.nanoTime(); // ns protected final Lock lock=new ReentrantLock(); public TimeService(final TimeScheduler timer) { this(timer, 500); } public TimeService(final TimeScheduler timer, long interval) { this.timer=timer; this.interval=interval; if(timer == null) throw new IllegalArgumentException("timer must not be null"); } /** * Returns the timestamp (ns). Because timestamp is volatile, the read will return the result of the most recent write * @return the result of the last call to {@link System#nanoTime()} (ns) */ public long timestamp() {return timestamp;} public long interval() { return interval; } public TimeService interval(long interval) { if(interval != this.interval) this.interval=interval; return this; } public boolean running() { lock.lock(); try { return task != null && !task.isDone(); } finally { lock.unlock(); } } public TimeService start() { lock.lock(); try { if(task == null || task.isDone()) task=timer.scheduleWithFixedDelay(this, interval, interval, TimeUnit.MILLISECONDS, false); return this; } finally { lock.unlock(); } } public TimeService stop() { lock.lock(); try { if(task != null) { task.cancel(false); task=null; } return this; } finally { lock.unlock(); } } public void run() { timestamp=System.nanoTime(); // JLS 17.7: the write to the volatile var makes the change visible to the next read } public String toString() { return getClass().getSimpleName() + " (interval=" + interval + "ms)"; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy