用java实现具体业务时,很多地方都要涉及到定时任务,比如说定时发送邮件、定时推送消息、定时抢购手机(这里我就想吐槽一下某米了)等。最近要用到这玩意儿,就研究了一下,大概有如下实现方式。
1,使用ScheduledThreadPoolExecutor实现
ScheduledThreadPoolExecutor是ThreadPoolExecutor的子类。
具体用法(每天0点执行new Runnable()进程):
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1); Calendar calender = Calendar.getInstance(); calender.set(Calendar.HOUR, 0); calender.set(Calendar.MINUTE, 0); calender.set(Calendar.SECOND, 0); long delay = calender.getTimeInMillis() - System.currentTimeMillis(); executor.scheduleAtFixedRate(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }, delay, 1, TimeUnit.DAYS);
scheduleAtFixedRate方法的四个参数:
command - the task to execute 要执行的任务
initialDelay - the time to delay first execution 延迟一段时间执行第一次
period - the period between successive executions 两次执行之间间隔时间
unit - the time unit of the initialDelay and period parameters 时间单位
2,使用Cron表达式实现