1. 使用enum枚举数据类型实现单例模式
1 public enum GroovyTimer {
2 INSTANCE;
3
4 private final AtomicInteger cacheTaskNumber = new AtomicInteger(1);
5 private ScheduledExecutorService pruneTimer;
6
7 GroovyTimer() {
8 this.create();
9 }
10
11 public ScheduledFuture<?> schedule(Runnable task, long delay) {
12 return this.pruneTimer.scheduleAtFixedRate(task, delay, delay, TimeUnit.MILLISECONDS);
13 }
14
15 public void create() {
16 if (null != this.pruneTimer) {
17 this.shutdownNow();
18 }
19
20 this.pruneTimer = new ScheduledThreadPoolExecutor(1,
21 (r) -> newGroovyThread(r, String.format("Groovy-Timer-%s", this.cacheTaskNumber.getAndIncrement())));
22 }
23 //
24 public Thread newGroovyThread(Runnable runnable, String name) {
25 Thread t = newThread(runnable, name, false);
26 if (t.getPriority() != 5) {
27 t.setPriority(5);
28 }
29
30 return t;
31 }
32
33 public static Thread newThread(Runnable runnable, String name, boolean isDaemon) {
34 Thread t = new Thread(null, runnable, name);
35 t.setDaemon(isDaemon);
36 return t;
37 }
38
39
40 public void shutdown() {
41 if (null != this.pruneTimer) {
42 this.pruneTimer.shutdown();
43 }
44
45 }
46
47 public List<Runnable> shutdownNow() {
48 return null != this.pruneTimer ? this.pruneTimer.shutdownNow() : null;
49 }
50 }
2. 使用静态内置类实现单例模式
1 public class DukeFileCleanThreadPool {
2 private final ScheduledThreadPoolExecutor executorService;
3
4 private DukeFileCleanThreadPool() {
5 executorService = new ScheduledThreadPoolExecutor(2,
6 new BasicThreadFactory.Builder().namingPattern("Guard-file-clean-pool-%d").build());
7 }
8
9 private static class SingletonHolder {
10 private static final GuardFileCleanThreadPool INSTANCE = new GuardFileCleanThreadPool();
11 }
12
13 public static DukeFileCleanThreadPool getInstance() {return SingletonHolder.INSTANCE;}
14
15 public void executeTask(Runnable command, long initialDelay, long period) {
16 executorService.scheduleAtFixedRate(command, initialDelay, period, TimeUnit.MILLISECONDS);
17 log.info("initiate file clean timer");
18 }
19 }