Timer定时器与任务调度

package com.thread_test;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

/**
 * Created by zhen on 2017-05-25.
 */
public class TraditionalTimerTest {
    static int count = 0;

    public static void main(String[] args){
        /**
         * 传统定时器
         *  定时器是Timer类
         *  Timer类主要使用schedule定时在某个时刻执行某件任务,任务是TimerTask对象
         */
        Timer timer = new Timer();
       /* timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("bombing!");
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        System.out.println("bombing!");
                    }
                }, 2000);
            }
        }, 4000, 6000);*/
       class MyTimerTask extends TimerTask{
           @Override
           public void run() {
               count = (count + 1) % 2;
               System.out.println("bombing!");
               timer.schedule(new MyTimerTask(), 4000 - 2000*count);
           }
       }
       timer.schedule(new MyTimerTask(), 4000);
        // public void schedule(TimerTask task, long delay)
        //可以使用public void schedule(TimerTask task, long delay, long period)实现连环炸,period是后面每次炸的周期

        /**
         * 现在要求实现先4秒,后两秒交替不间断爆炸
         *  我的思路:
         *      第一次4秒开启定时任务爆炸,并且任务周期为6秒
         *      在任务过程中开启另一个定时任务,一次性,2秒后爆炸
         *      编码,测试,效果可以实现
         *  思路2:
         *      不使用周期任务,先第一个任务执行,定时4秒,爆炸同时开启第二个任务,第二个任务定时2秒,第二个任务爆炸同时开启第三个任务,定时4秒...
         *      这样也可以实现,需要在Task中判断生成另一个Task并调度,每次调度改变一个状态变量的值,依据状态进行选择
         *      也可以使用两个不同的TimerTask任务类,这样简单点。
         */

        new Thread(){//监控者
            @Override
            public void run() {
                while(true){
                    System.out.println(new Date().getSeconds());
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

    /**
     * 我们经常需要的定时任务。
     * 比如每天凌晨2:00发个邮件,怎么弄呢?
     * public void schedule(TimerTask task, Date time)
     * public void schedule(TimerTask task, Date firstTime, long period)
     * schedule的第二个参数可以传递date类型,然后周期就设置为1天的long值即可,让它第一次在指定时间爆炸
     *
     * 如果我们需要星期12345发邮件,星期六星期天不发怎么办呢?
     *  我的想法是我们在任务中进行判断,进行日历的判断,如果是在指定星期内,那么才执行。
     *
     *  更精细的任务的我们可以借助开源项目Quartz,知道这个项目,需要的时候学习使用它即可。
     */
}

 

posted @ 2017-05-25 08:15  guodaxia  阅读(210)  评论(0)    收藏  举报