了解了一下Java实现简单定时任务的三种方式,分别做了个例子。
自己写篇以记录、备忘。
注释都清楚了,不另外解释。
方式一:
- package test.timertask;
-
- /**
- * 使用Thread.sleep的方式来实现
- * 这种方式完全是自己实现的,该控制的地方控制,怎么写都可以
- * @author wz
- */
- public class MyTimerTask {
- public static void main(String[] args) {
- MyTimerTask mt = new MyTimerTask();
- mt.task();
- }
-
- public void task(){
-
- final long timeInterval = 1000;
- (new Runnable() {
- public void run() {
- while (true) {
- // 执行任务
- System.out.println("do the task……");
- try {
- Thread.sleep(timeInterval);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }).run();
- //这里直接调runnable的run方法了,这样是由main方法的执行线程直接转去执行这个runnable了(同一个线程)
- //当然也可new一个Thread,将runnable扔进去后调用其start方法(另启一线程)
- }
- }
方式二:
- package test.timertask;
-
- import java.util.Timer;
- import java.util.TimerTask;
-
- /**
- *
- * @author wz
- * 通过Timer和TimerTask来实现,jdk自己实现且封装了其操作,
- * TimerTask实现Runnable接口,但是其实现正是留给用户制定任务的接口
- * 然后通过Timer来执行即可,Timer另启线程来执行任务,且实现了线程同步的,所示线程安全的
- * Timer维持一个任务队列,可以调度多个任务
- *
- */
- public class MyTimerTask2 {
- public static void main(String[] args) {
- MyTimerTask2 mt2 =new MyTimerTask2();
- mt2.task();
- }
- public void task(){
- //制定一个任务
- TimerTask task = new TimerTask() {
- @Override
- public void run() {
- System.out.println("执行任务ing");
- }
- };
-
- // task - 所要安排的任务。
- // delay - 执行任务前的延迟时间,单位是毫秒。
- // period - 执行各后续任务之间的时间间隔,单位是毫秒。
- Timer timer = new Timer();
- long delay = 0;
- long intevalPeriod = 1 * 1000;
- timer.scheduleAtFixedRate(task, delay, intevalPeriod);
- }
- }
方式三:
- package test.timertask;
-
- import java.util.concurrent.Executors;
- import java.util.concurrent.ScheduledExecutorService;
- import java.util.concurrent.ScheduledFuture;
- import java.util.concurrent.TimeUnit;
-
- /**
- *
- * @author wz
- * jdk1.5提供了支持并发的定时任务处理工具ScheduledExecutorService
- * 1.以线程池的方式来执行任务,效率高了
- * 2.可以设置开始延迟时间和任务取消时间
- *
- */
- public class MyTimerTask3 {
- public static void main(String[] args) {
- MyTimerTask3 mtt = new MyTimerTask3();
- mtt.taskForAPeriod();
- }
-
- private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
-
- public void taskForAPeriod() {
- //定义一个任务
- final Runnable task = new Runnable() {
- public void run() {
- System.out.println("执行任务");
- }
- };
-
- // scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit):
- // 通过ScheduledExecutorService的scheduleAtFixedRate来执行任务
- // 参数
- // command - 要执行的任务
- // initialDelay - 首次执行的延迟时间
- // period - 连续执行之间的周期
- // unit - initialDelay 和 period 参数的时间单位
- final ScheduledFuture<?> taskHandle = scheduler.scheduleAtFixedRate(task, 1, 1, TimeUnit.SECONDS);
-
-
- // schedule(Runnable command,long delay,TimeUnit unit)创建并执行在给定延迟后启用的一次性操作。 (取消任务本身也是一个任务,一次去下就OK)
- // 参数:
- // command - 要执行的任务
- // delay - 从现在开始延迟执行的时间
- // unit - 延迟参数的时间单位
- scheduler.schedule(new Runnable() {
- public void run() {
- taskHandle.cancel(true); //取消任务
- }
- }, 10, TimeUnit.SECONDS); //在10个TimeUnit.SECONDS时间单位后
- }
-
- }
|