1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| package server;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class TimerManager {
private static TimerManager instance = new TimerManager();
private ScheduledThreadPoolExecutor ses;
public static TimerManager getInstance() {
return instance;
}
public void start() {
if (ses != null && !ses.isShutdown() && !ses.isTerminated()) {
return;
}
final ThreadFactory thread = new ThreadFactory() {
private final AtomicInteger threadNumber = new AtomicInteger(1);
@Override
public Thread newThread(Runnable r) {
final Thread t = new Thread(r);
t.setName("Timermanager-Worker-" + threadNumber.getAndIncrement());
return t;
}
};
ses = new ScheduledThreadPoolExecutor(4, thread);
}
public boolean isExistent() {
return ses != null;
}
public boolean isShutdown() {
return ses.isShutdown();
}
public void stop() {
ses.shutdownNow();
ses = null;
}
public void unregister(Runnable r) {
ses.remove(r);
}
public void executeNow(Runnable r) {
ses.execute(r);
}
public ScheduledFuture<?> register(Runnable r, long repeatTime, long delay) {
return ses.scheduleAtFixedRate(r, delay, repeatTime, TimeUnit.MILLISECONDS);
}
public ScheduledFuture<?> register(Runnable r, long repeatTime) {
return ses.scheduleAtFixedRate(r, 0, repeatTime, TimeUnit.MILLISECONDS);
}
public ScheduledFuture<?> schedule(Runnable r, long delay) {
return ses.schedule(r, delay, TimeUnit.MILLISECONDS);
}
public ScheduledFuture<?> scheduleAtTimestamp(Runnable r, long timestamp) {
return schedule(r, timestamp - System.currentTimeMillis());
}
public void purgeTM() {
ses.purge();
}
} |