java定时器 Timer

java定时器的使用(Timer)
1、在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等。对于这样的操作最方便、高效的实现方式就是使用

java.util.Timer工具类。

private java.util.Timer timer; 

timer = new Timer(true); 

timer.schedule( 

new java.util.TimerTask() { public void run() { //server.checkNewMail(); 要操作的方法 } }, 0, 5*60*1000);


第一个参数是要操作的方法,第二个参数是要设定延迟的时间,第三个参数是周期的设定,每隔多长时间执行该操作。

使用这几行代码之后,Timer本身会每隔5分钟调用一遍server.checkNewMail()方法,不需要自己启动线程。Timer本身也是多

线程同步的,多个线程可以共用一个Timer,不需要外部的同步代码。
2、
(1)Timer.schedule(TimerTask task,Date time)安排在制定的时间执行指定的任务。
(2)Timer.schedule(TimerTask task,Date firstTime ,long period)安排指定的任务在指定的时间开始进行重复的固定延迟执行.
(3)Timer.schedule(TimerTask task,long delay)安排在指定延迟后执行指定的任务.
(4)Timer.schedule(TimerTask task,long delay,long period)安排指定的任务从指定的延迟后开始进行重复的固定延迟执行.
(5)Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)安排指定的任务在指定的时间开始进行重复的固定

速率执行.
(6)Timer.scheduleAtFixedRate(TimerTask task,long delay,long period)安排指定的任务在指定的延迟后开始进行重复的固定速

率执行.


1.基础

Date,这个大家都认识了,用于保存日期信息,但不推荐进行日期操作及初始化特定日期

Calendar及其子类GregorianCalendar:日历类,日期操作,初始化特定日期。

DateFormat及其子类SimpleDateformat: 日期格式化,日期的默认显示方式不适合中国人,所以需要格式化为中国人常用的格

式来显示。

取得当期日期, Date date=new Date();

初始化特定日期:假设我们要得到日期为2006-10-27日的对象,需要按如下方式获得。

Calendar cal = new GregorianCalendar(2006, 9, 27,0,0,0); 

 Date date = cal.getTime();



注意:date,getTime()取得的是当期时间的毫秒数,月份比实际的减1

GregorianCalendar构造方法参数依次为:年,月-1,日,小时,分,秒



格式化为我们熟悉的方式显示:

DateFormat format=new SimpleDateFormat("yyyy-MM-dd HH;mm:ss"); 

 String chinesedate = format.format(date);



日期 年,月,日,分,秒的取得

Calendar cal = Calendar.getInstance(); 


 int year = cal.get(Calendar.YEAR); 


 int month=cal.get(Calendar.MONTH)+1; 


 int day = cal.get(Calendar.DAY_OF_MONTH); 


 int hour = cal.get(Calendar.HOUR_OF_DAY); 


 int minute = cal.get(Calendar.MINUTE); 


 int second = cal.get(Calendar.SECOND);



注意:月份,实际的月份要比Clendar得到的加1,因为java月份是从0~11

2.日期基本操作

得到两个日期相差的天数

Date endDate=.. 


 Date startDate = ... 


 相差天数 int days=(int) ((endDate.getTime()-startDate.getTime())/(1000*24*60*60)+0.5);



得到某个月的天数

Calendar cal = Calendar.getInstance(); 


 int month=cal.getActualMaximum(Calendar.DAY_OF_MONTH);



日期加1天

cal.add(Calendar.DATE, 1);//日期加1天 


 Calendar.YEAR,Calendar.MONTH,Calendar.WEEK_OF_YEAR),分别是年,月,周



3,java.sql,Date()和java.util.Date();

前面我们说的都是java.util.Date类,java.sql.Date类是操作数据库用的日期类型

java.util.Date date=.... 


 java.sql.Date sqldate=new java.sql.Date(date.getTime());



也可以这样:

String date="2005-11-10"; 


 java.sql.Date sqlDate=java.sql.Date.valueOf(date);



4,定时器

a,编写类,实现TimeTask接口,定时执行的代码写入run()方法中

b. timer.schedule(TimeTask子类对象, 开始执行的日期, 周期);

周期为毫秒数

例子:

类MyTask:

import java.util.*; 


public class MyTask extends TimerTask { 

 public void run() { 

 System.out.println("MyTask 正在执行..."); 

 } 

}



类TimerDemo:

import java.util.Timer; 

import java.util.Calendar; 

import java.util.GregorianCalendar; 

import java.util.Date; 


public class TimerDemo { 

 public static void main(String[] args) { 

 Timer timer = new Timer(); 

 MyTask task = new MyTask(); 

 Calendar cal = new GregorianCalendar(2006, 9, 28, 12, 49, 0); 

 Date date = cal.getTime(); 

 System.out.println("date :" + date.toLocaleString()); 

 timer.schedule(task, date, 1000); 

 }