1
0
mirror of https://github.com/mitb-archive/filebot synced 2024-11-11 03:45:06 -05:00
filebot/source/net/sourceforge/tuned/Timer.java

93 lines
1.9 KiB
Java
Raw Normal View History

2008-12-30 11:43:37 -05:00
package net.sourceforge.tuned;
import java.util.concurrent.ScheduledFuture;
2008-12-30 11:43:37 -05:00
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public abstract class Timer implements Runnable {
private final ScheduledThreadPoolExecutor executor;
private ScheduledFuture<?> scheduledFuture;
2008-12-30 11:43:37 -05:00
private Thread shutdownHook;
2008-12-30 11:43:37 -05:00
public Timer() {
2009-10-12 20:28:59 -04:00
executor = new ScheduledThreadPoolExecutor(1, new DefaultThreadFactory("Timer", Thread.NORM_PRIORITY, true));
2008-12-30 11:43:37 -05:00
}
public synchronized void set(long delay, TimeUnit unit, boolean runBeforeShutdown) {
removeScheduledFuture();
Runnable r = this;
if (runBeforeShutdown) {
addShutdownHook();
// remove shutdown hook after execution
r = new Runnable() {
@Override
public void run() {
try {
Timer.this.run();
} finally {
removeShutdownHook();
}
}
};
} else {
// remove existing shutdown hook, if any
removeShutdownHook();
}
scheduledFuture = executor.schedule(r, delay, unit);
2008-12-30 11:43:37 -05:00
}
public synchronized void cancel() {
removeScheduledFuture();
removeShutdownHook();
}
private synchronized void removeScheduledFuture() {
if (scheduledFuture != null) {
try {
scheduledFuture.cancel(true);
executor.purge();
2008-12-30 11:43:37 -05:00
} finally {
scheduledFuture = null;
}
}
}
private synchronized void addShutdownHook() {
if (shutdownHook == null) {
shutdownHook = new Thread(this);
Runtime.getRuntime().addShutdownHook(shutdownHook);
}
}
private synchronized void removeShutdownHook() {
if (shutdownHook != null) {
try {
if (shutdownHook != Thread.currentThread()) {
// can't remove shutdown hooks anymore, once runtime is shutting down,
// so don't remove the shutdown hook, if we are running on the shutdown hook
Runtime.getRuntime().removeShutdownHook(shutdownHook);
}
} finally {
shutdownHook = null;
}
}
}
}