Skip to content

Instantly share code, notes, and snippets.

@seveniu
Last active August 29, 2015 14:09
Show Gist options
  • Select an option

  • Save seveniu/78b490b77452b8479496 to your computer and use it in GitHub Desktop.

Select an option

Save seveniu/78b490b77452b8479496 to your computer and use it in GitHub Desktop.
java timer by day
package com.dhlz.webService.util;
import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.*;
/**
* User: seveniu
* Date: 11/12/14
* Time: 5:46 PM
* Project: FireGetAll
*/
public class TimerManager {
private ConcurrentHashMap<String, ScheduledExecutorService> timerMap = new ConcurrentHashMap<>();
private static TimerManager instance = new TimerManager();
private TimerManager() {
}
public static TimerManager get() {
return instance;
}
/**
* @param name 任务名
* @param timerTask 任务
* @param hour 小时
*/
public void addDayTimerTask(final String name, final Runnable timerTask, int hour) {
addTimerTask(name, timerTask, getFirstDelay(getFirstRunTime(hour, 0, 0)), 1, TimeUnit.DAYS);
}
/**
* @param name 任务名
* @param timerTask 任务
* @param hour 小时
* @param minute 分钟
*/
public void addDayTimerTask(final String name, final Runnable timerTask, int hour, int minute) {
addTimerTask(name, timerTask, getFirstDelay(getFirstRunTime(hour, minute, 0)), 1, TimeUnit.DAYS);
}
/**
* @param name 任务名
* @param timerTask 任务
* @param hour 小时
* @param minute 分钟
* @param second 秒
*/
public void addDayTimerTask(final String name, final Runnable timerTask, int hour, int minute, int second) {
addTimerTask(name, timerTask, getFirstDelay(getFirstRunTime(hour, minute, second)), 1, TimeUnit.DAYS);
}
/**
* @param name 任务名
* @param timerTask 任务
* @param hour 小时
* @param minute 分钟
* @param second 秒
*/
public void addTimerTask(final String name, final Runnable timerTask, int hour, int minute, int second, long period, TimeUnit timeUnit) {
long firstDelay = getFirstDelay(getFirstRunTime(hour, minute, second));
System.out.println("firstDelay : " + firstDelay);
addTimerTask(name, timerTask, firstDelay, period, timeUnit);
}
/**
* 添加周期任务
*
* @param name 任务名
* @param timerTask 任务
* @param period 周期
* @param timeUnit 周期的单位
*/
public void addTimerTask(final String name, final Runnable timerTask, long firstDelay, long period, TimeUnit timeUnit) {
if (timerTask == null) {
throw new NullPointerException("timerTask is null");
}
ScheduledExecutorService scheduled = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setName(name);
return thread;
}
});
scheduled.scheduleWithFixedDelay(timerTask,
firstDelay,
period,
timeUnit);
timerMap.put(name, scheduled);
}
/**
* 获取第一次执行的时间
*
* @param hour 小时
* @param minute 分钟
* @param second 秒
* @return 第一次执行的时间
*/
public Date getFirstRunTime(int hour, int minute, int second) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, second);
Date date = calendar.getTime();
if (date.before(new Date())) {
calendar.add(Calendar.DAY_OF_YEAR, 1);
date = calendar.getTime();
}
return date;
}
private long getFirstDelay(Date date) {
return (date.getTime() - System.currentTimeMillis()) / 1000;
}
public void stopTimer(String name) {
timerMap.get(name).shutdown();
}
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(new Date());
}
};
// TimerManager.get().addTimerTask("test", runnable, 10, 2, TimeUnit.SECONDS);
// TimerManager.get().addTimerTask("test", runnable, 19, 26, 0, 4, TimeUnit.SECONDS);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment