ScheduledFuture> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) 创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在 initialDelay 后开始执行,然后在 initialDelay+period 后执行,接着在 initialDelay + 2 * period 后执行,依此类推。
initialDelay允许出现 0 和负数延迟(但不是周期),并将这些视为一种立即执行的请求.
下面我举例用来实现一个Task,在每天的上午8点运行.
代码如下:
public class SchedulerSample { /** * 定时执行调度类,来定时调度 */ private ScheduledExecutorService schuledExecutor; private final static String timer = "08:00:00"; //所有定时任务的Future private Map> futureMap = new Hashtable >(); /** * Construct for SchedulerSample.java. */ public SchedulerSample() { } //可以创建该schedule的方法,如init start stop reload etc. void start() throws ParseException{ String result = "Admin's test "; schuledExecutor = Executors.newScheduledThreadPool(3); MockTask task = new MockTask(result); long PERIOD = 24 * 60 * 60 * 1000L; //TimeUnit.MILLISECONDS 指明时间单位.为毫秒 long delay = 0; String key = "only a test "; long curTime = System.currentTimeMillis(); DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String tmpstr = df.format(new Date(curTime)); String tmpstr2 = tmpstr.substring(0, 11) + timer; long executeTime = df.parse(tmpstr2).getTime(); //这个值就是自程序运行时,多久以后运行MockTask. delay = executeTime - curTime < 0 ? (executeTime - curTime + PERIOD) : (executeTime - curTime); //here for test , assign delay = 0 or delay is negative and PERIOD = 10 * 1000; delay = 0; delay = -1; PERIOD = 10 * 1000; Future> future = schuledExecutor.scheduleAtFixedRate(task, delay , PERIOD, TimeUnit.MILLISECONDS); futureMap.put(key, future); } void stop(){ schuledExecutor.shutdown(); for(Future> fu : futureMap.values()){ fu.cancel(true); } futureMap.clear(); } void reload() throws ParseException{ stop(); start(); } //etc methods,here dont care that /** * here is the test * @throws ParseException */ public static void main(String[] args) throws ParseException{ SchedulerSample ss = new SchedulerSample(); ss.start(); } } /** * . * @author Admin Jul 21, 2008 3:23:38 PM * */ class MockTask implements Runnable{ String print = ""; //here implemtion we only print a few word; public MockTask(String print){ this.print = print; } private void Print(String str){ System.out.print(new Date(System.currentTimeMillis())+" | "); System.out.println(str); } public void run() { Print(this.print); } }
运行结果,Console出现如下
Mon Jul 21 15:36:03 CST 2008 | Admin's test Mon Jul 21 15:36:13 CST 2008 | Admin's test Mon Jul 21 15:36:23 CST 2008 | Admin's test Mon Jul 21 15:36:33 CST 2008 | Admin's test Mon Jul 21 15:36:43 CST 2008 | Admin's test Mon Jul 21 15:36:53 CST 2008 | Admin's test Mon Jul 21 15:37:03 CST 2008 | Admin's test Mon Jul 21 15:37:13 CST 2008 | Admin's test Mon Jul 21 15:37:23 CST 2008 | Admin's test Mon Jul 21 15:37:33 CST 2008 | Admin's test
时间周期就是我们所测试设定的10*1000,其他的时间依次类推..定点执行,可以用delay来计算.具体请参照代码.请大家批评指正.