org.openstreetmap.atlas.utilities.threads.Ticker Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of atlas Show documentation
Show all versions of atlas Show documentation
"Library to load OSM data into an Atlas format"
package org.openstreetmap.atlas.utilities.threads;
import java.io.Closeable;
import org.openstreetmap.atlas.utilities.scalars.Duration;
import org.openstreetmap.atlas.utilities.time.Time;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Ticker companion.
*
* @author matthieun
*/
public abstract class Ticker implements Runnable, Closeable
{
private static final Logger logger = LoggerFactory.getLogger(Ticker.class);
private static final Duration CHECK_TIME = Duration.milliseconds(500);
private final String name;
private final Duration tickerTime;
// This tells the ticker it is time to stop ticking.
private volatile boolean stop;
/**
* @param name
* The name of the ticker companion
* @param tickerTime
* The duration between each tick. It is indicative only.
*/
public Ticker(final String name, final Duration tickerTime)
{
this.name = name;
this.tickerTime = tickerTime;
this.stop = false;
}
@Override
public void close()
{
this.stop = true;
}
public String getName()
{
return this.name;
}
@Override
public void run()
{
final Time start = Time.now();
Time lastCheck = Time.now();
while (!this.stop)
{
// Sleep small, to check regularly. If the thread is "closed" it will then die fairly
// soon even if the ticker time is really long.
CHECK_TIME.lowest(this.tickerTime).sleep();
if (lastCheck.elapsedSince().isMoreThan(this.tickerTime))
{
try
{
tickAction(start.elapsedSince());
}
catch (final Exception e)
{
// In case of any error in tickAction, kill the ticker silently, with a nice
// error message.
logger.error("{} tick action failed! Associated job should not be affected.",
getName(), e);
}
lastCheck = Time.now();
}
}
}
@Override
public String toString()
{
return "Ticker [name=" + this.name + ", tickerTime=" + this.tickerTime + "]";
}
/**
* Act upon a tick event.
*
* @param sinceStart
* The duration elapsed since the start of the ticker.
*/
protected abstract void tickAction(Duration sinceStart);
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy