JAVA 定时方式大总结
JAVA 定时方式大总结
?
除了Quartz之外,JAVA的定时方式总结如下几种:
方式一:java.util.Timer?
java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks。?
一个TimerTask实际上就是一个拥有run方法的类,需要定时执行的代码放到run方法体内,TimerTask一般是以匿名类的方式创建。?
一个完整的Timer:?

- java.util.Timer?timer?=?new?java.util.Timer(true);???
- //?true?说明这个timer以daemon方式运行(优先级低,???
- //?程序结束timer也自动结束),注意,javax.swing???
- //?包中也有一个Timer类,如果import中用到swing包,???
- //?要注意名字的冲突。???
- ??
- TimerTask?task?=?new?TimerTask()?{???
- public?void?run()?{???
- ...?//每次需要执行的代码放到这里面。???
- }???
- };???
- ??
- //以下是几种调度task的方法:???
- ??
- timer.schedule(task,?time);???
- //?time为Date类型:在指定时间执行一次。???
- ??
- timer.schedule(task,?firstTime,?period);???
- //?firstTime为Date类型,period为long???
- //?从firstTime时刻开始,每隔period毫秒执行一次。???
- ??
- timer.schedule(task,?delay)???
- //?delay?为long类型:从现在起过delay毫秒执行一次???
- ??
- timer.schedule(task,?delay,?period)???
- //?delay为long,period为long:从现在起过delay毫秒以后,每隔period???
- //?毫秒执行一次。??
???
????
下面是一个完整的例子,由两个类组成,一个定制任务,一个调用java.util.Timer?
定制任务:?

- import?java.util.Timer;??
- ??
- public?class?TimerTaskTest?extends?java.util.TimerTask{??
- ??
- @Override??
- public?void?run()?{??
- ???//?TODO?Auto-generated?method?stub??
- ???System.out.println("start");??
- }??
- }??
2.调用java.util.Timer?

- import?java.util.Timer;??
- ??
- public?class?Test?{??
- public?static?void?main(String[]?args){??
- ???Timer?timer?=?new?Timer();??
- ???timer.schedule(new?TimerTaskTest(),?1000,?2000);??
- }??
- }??
根据上面的介绍,便可以在1秒后,每隔2秒执行一次程序
?
方式二:
?
ScheduledThreadPoolExecutor scheduledExecutor = new ScheduledThreadPoolExecutor(poolSize);
scheduledExecutor.scheduleAtFixedRate(myTask, initialDelay, run_period, TimeUnit.MINUTES);
myTask是一个实现Runnable接口的线程类。
imports:
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
方式三:
?
Runnable task = new DelegatingErrorHandlingRunnable(this,TaskUtils.LOG_AND_SUPPRESS_ERROR_HANDLER);
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryBuilder().setNameFormat(
"JdkExecutorJob-%1$d").build());
//scheduleAtFixedRatefixRate() 固定任务两次启动之间的时间间隔.
//scheduleAtFixedDelay() ? ? ?固定任务结束后到下一次启动间的时间间隔.
scheduledExecutorService.scheduleAtFixedRate(task, initialDelay, period, TimeUnit.SECONDS);
imports:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
?
?