java 自定义定时器(TimerTask)

需求:实现一个简单的定时任务

 Version:1

 

/**
 *    这是一个简单的定时任务类
 */
public class Timing extends TimerTask{
    @Test
    public static void main(String[] args) {
        Timing timing = new Timing();
        Timer timer = new Timer();//构建定时器
        Date date = timing.setTimer(16, 33, 10);
        System.out.println("定时任务执行开始时间:"+date);
        timer.schedule(timing,date);
        
    }
    // yyyy-MM-dd hh:mm:ss
    //设置时分秒
    public Date setTimer(Integer hh, Integer mm, Integer ss) {
        Calendar calendar = Calendar.getInstance();//获取日历类
        calendar.set(calendar.HOUR_OF_DAY, hh); //设置时
        calendar.set(calendar.MINUTE, mm);//设置分
        calendar.set(calendar.SECOND, ss);//设置秒
        Date time = calendar.getTime();//获取date
        return time;
    }


    @Override
    public void run() {
        //要执行的任务
        System.out.println("定时任务执行了");
        
    }
}

Version:2

 

 

package com.itcast.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import java.util.Timer;
import java.util.TimerTask;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.itcast.bean.Vip;
import com.itcast.dao.VipMapper;



/**
 *	这是一个简单的定时任务类
 */

public class Timing extends TimerTask implements VipMapper{
	//获取东八区时间
	TimeZone zone = TimeZone.getTimeZone("GMT+08:00");
	//获取日历类
	public Calendar calendar = Calendar.getInstance(zone);
	
	public static long forCycle;
	/**
	 * @param1 开始执行时间
	 * @param2 任务间隔时间
	 * @param3 是否执行任务
      @param4 下次执行时间 
   */
	public static void runTiming(String date,long cycle,boolean flag,long nextTime){
		Timing timing=new Timing();
			//构建定时器
			Timer timer = new Timer();
			//设置的时间
			Date startTime=new Date(date); 
			//最新的时间
			Date nowDate = new Date();
			//如果时间已经过去需要的 下次执行时间
			
			System.out.println("设置时间为:"+startTime.toLocaleString());
			System.out.println("当前时间为:"+new Date().toLocaleString());
			System.out.println("nextTime:"+nextTime);
			forCycle=(60*60*1000)*cycle;
			if(flag){
				int i = startTime.compareTo(nowDate);//设置时间与当前时间作比较
				if(i>=0){//如果设置时间>0表示设置的时间 未到  =0表示 时间想等 <0表示时间已经过去了
					timer.schedule(timing, startTime,forCycle);
				}else{
					System.out.println("设置时间已经过期,延迟至下一个周期执行,下次执行时间为:"+Timing.getTime(nextTime)+"  以后");
					//参数1 继承类
					//参数2 如果设置时间小于当前时间 延迟多长时间后才会执行的参数
					//参数3 循环执行周期
					timer.schedule(timing,nextTime,forCycle);
				}
			}else{
				System.out.println("任务未开启,无法执行");
			}
	}
/*	// yyyy-MM-dd hh:mm:ss
	//设置时分秒
	public Date setTimer(Integer hh, Integer mm, Integer ss) {
		calendar.set(calendar.HOUR_OF_DAY, hh); //设置时
		calendar.set(calendar.MINUTE, mm);//设置分
		calendar.set(calendar.SECOND, ss);//设置秒
		Date time = calendar.getTime();//获取date
		return time;
	}*/


	//要执行的任务
	@Override
	public void run() {
		System.out.println("定时任务开始执行,当前时间:"+new Date().toLocaleString());
		
		List<Vip> list = list();
		for (int i = 0; i < list.size(); i++) {
			Date date = list.get(i).getBorthday();
			//获取日期格式化
			SimpleDateFormat sdf=new SimpleDateFormat("MM-dd");
			String borthday = sdf.format(date);
			
			System.out.println(list.get(i).getName()+"的生日是:"+borthday);
			//获取当前日期
			String str = sdf.format(new Date());
			if(borthday.equals(str)){
				SimpleDateFormat sdf1=new SimpleDateFormat("yyyy");
				//数据库中的 年份
				String y = sdf1.format(list.get(i).getBorthday());
				//当前 年份
				String ny=sdf1.format(new Date());
				
				Integer year = new Integer(y);
				Integer nowYear = new Integer(ny);
				String msg="亲爱的"+list.get(i).getName()+",今天是你<font size='5' color='red'>"+(nowYear-year)+"</font>岁的生日,在此祝你"+
				"工作顺利 生活幸福 ";
				try {
					SendEmail.sendMail(list.get(i).getEmail(),msg);
				} catch (Exception e){
					e.printStackTrace();
				}
			}else{
				System.out.println(list.get(i).getName()+"没过生日");
			}
		}
		System.out.println("定时任务执行结束,当前时间:"+new Date().toLocaleString());
	}
	
	//查数据库
	@Override
	public List<Vip> list() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		VipMapper vipMapper = ac.getBean(VipMapper.class);
		List<Vip> list = vipMapper.list();
		
		return list;
	}
	//日期转换时间戳
	public static  List<Long> turnDate(Date newDate,Date setDate) {
		//时间转换为24小时制
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		//SimpleDateFormat sdf=new SimpleDateFormat("HH");
		List<Long> list=new ArrayList<Long>();
		
		//最新时间转化时间戳过程
		String str1 = sdf.format(newDate);
		Date d;
		try {
			d = sdf.parse(str1);
			long newDateTime = d.getTime();
			
			//设置时间转换时间戳过程
			String str2 = sdf.format(setDate);
			Date d1 = sdf.parse(str2);
			long setDateTime = d1.getTime();
			
			//添加到集合当中去
			list.add(0,newDateTime);
			list.add(1,setDateTime);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		return list;
	}
	//把一个 long 时间戳转换成小时,分钟,秒 格式String 并返回
	public static String getTime(long time) {
		  String str = "" ;
		  time = time / 1000;
		  int s = (int) (time % 60);
		  int m = (int) (time / 60 % 60);
		  int h = (int) (time / 3600);
		  str = h + "小时" + m + "分" + s +"秒";  
		  return str ;
		 }
}
      @param4 下次执行时间 
   */
	public static void runTiming(String date,long cycle,boolean flag,long nextTime){
		Timing timing=new Timing();
			//构建定时器
			Timer timer = new Timer();
			//设置的时间
			Date startTime=new Date(date); 
			//最新的时间
			Date nowDate = new Date();
			//如果时间已经过去需要的 下次执行时间
			
			System.out.println("设置时间为:"+startTime.toLocaleString());
			System.out.println("当前时间为:"+new Date().toLocaleString());
			System.out.println("nextTime:"+nextTime);
			forCycle=(60*60*1000)*cycle;
			if(flag){
				int i = startTime.compareTo(nowDate);//设置时间与当前时间作比较
				if(i>=0){//如果设置时间>0表示设置的时间 未到  =0表示 时间想等 <0表示时间已经过去了
					timer.schedule(timing, startTime,forCycle);
				}else{
					System.out.println("设置时间已经过期,延迟至下一个周期执行,下次执行时间为:"+Timing.getTime(nextTime)+"  以后");
					//参数1 继承类
					//参数2 如果设置时间小于当前时间 延迟多长时间后才会执行的参数
					//参数3 循环执行周期
					timer.schedule(timing,nextTime,forCycle);
				}
			}else{
				System.out.println("任务未开启,无法执行");
			}
	}
/*	// yyyy-MM-dd hh:mm:ss
	//设置时分秒
	public Date setTimer(Integer hh, Integer mm, Integer ss) {
		calendar.set(calendar.HOUR_OF_DAY, hh); //设置时
		calendar.set(calendar.MINUTE, mm);//设置分
		calendar.set(calendar.SECOND, ss);//设置秒
		Date time = calendar.getTime();//获取date
		return time;
	}*/


	//要执行的任务
	@Override
	public void run() {
		System.out.println("定时任务开始执行,当前时间:"+new Date().toLocaleString());
		
		List<Vip> list = list();
		for (int i = 0; i < list.size(); i++) {
			Date date = list.get(i).getBorthday();
			//获取日期格式化
			SimpleDateFormat sdf=new SimpleDateFormat("MM-dd");
			String borthday = sdf.format(date);
			
			System.out.println(list.get(i).getName()+"的生日是:"+borthday);
			//获取当前日期
			String str = sdf.format(new Date());
			if(borthday.equals(str)){
				SimpleDateFormat sdf1=new SimpleDateFormat("yyyy");
				//数据库中的 年份
				String y = sdf1.format(list.get(i).getBorthday());
				//当前 年份
				String ny=sdf1.format(new Date());
				
				Integer year = new Integer(y);
				Integer nowYear = new Integer(ny);
				String msg="亲爱的"+list.get(i).getName()+",今天是你<font size='5' color='red'>"+(nowYear-year)+"</font>岁的生日,在此祝你"+
				"工作顺利 生活幸福 ";
				try {
					SendEmail.sendMail(list.get(i).getEmail(),msg);
				} catch (Exception e){
					e.printStackTrace();
				}
			}else{
				System.out.println(list.get(i).getName()+"没过生日");
			}
		}
		System.out.println("定时任务执行结束,当前时间:"+new Date().toLocaleString());
	}
	
	//查数据库
	@Override
	public List<Vip> list() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		VipMapper vipMapper = ac.getBean(VipMapper.class);
		List<Vip> list = vipMapper.list();
		
		return list;
	}
	//日期转换时间戳
	public static  List<Long> turnDate(Date newDate,Date setDate) {
		//时间转换为24小时制
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		//SimpleDateFormat sdf=new SimpleDateFormat("HH");
		List<Long> list=new ArrayList<Long>();
		
		//最新时间转化时间戳过程
		String str1 = sdf.format(newDate);
		Date d;
		try {
			d = sdf.parse(str1);
			long newDateTime = d.getTime();
			
			//设置时间转换时间戳过程
			String str2 = sdf.format(setDate);
			Date d1 = sdf.parse(str2);
			long setDateTime = d1.getTime();
			
			//添加到集合当中去
			list.add(0,newDateTime);
			list.add(1,setDateTime);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		return list;
	}
	//把一个 long 时间戳转换成小时,分钟,秒 格式String 并返回
	public static String getTime(long time) {
		  String str = "" ;
		  time = time / 1000;
		  int s = (int) (time % 60);
		  int m = (int) (time / 60 % 60);
		  int h = (int) (time / 3600);
		  str = h + "小时" + m + "分" + s +"秒";  
		  return str ;
		 }
}

 

 

 

 

 

    原文作者:yanpengfeil
    原文地址: https://blog.csdn.net/yanpengfeil/article/details/79169035
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞