`

java定时器

    博客分类:
  • java
jvm 
阅读更多

首页资讯精华论坛问答博客专栏群组更多 ▼


欢迎hoochiang1收件箱(2)我的应用

我的博客设置退出



不要看跑的有多快,要看跑的有多远。


博客
微博
相册
收藏
留言
关于我




.




java中timer用法
博客分类: java综合

Java框架多线程企业应用JVM .


所有类型的 Java 应用程序一般都需要计划重复执行的任务。企业应用程序需要计划每日的日志或者晚间批处理过程。一个 J2SE 或者 J2ME 日历应用程序需要根据用户的约定计划闹铃时间。不过,标准的调度类 Timer 和 TimerTask 没有足够的灵活性,无法支持通常需要的计划任务类型。在本文中,Java 开发人员 Tom White 向您展示了如何构建一个简单通用的计划框架,以用于执行任意复杂的计划任务。

我将把 java.util.Timer 和 java.util.TimerTask 统称为 Java 计时器框架,它们使程序员可以很容易地计划简单的任务(注意这些类也可用于 J2ME 中)。在 Java 2 SDK, Standard Edition, Version 1.3 中引入这个框架之前,开发人员必须编写自己的调度程序,这需要花费很大精力来处理线程和复杂的 Object.wait() 方法。不过,Java 计时器框架没有足够的能力来满足许多应用程序的计划要求。甚至一项需要在每天同一时间重复执行的任务,也不能直接使用 Timer 来计划,因为在夏令时开始和结束时会出现时间跳跃。

本文展示了一个通用的 Timer 和 TimerTask 计划框架,从而允许更灵活的计划任务。这个框架非常简单 —— 它包括两个类和一个接口 —— 并且容易掌握。如果您习惯于使用 Java 定时器框架,那么您应该可以很快地掌握这个计划框架。

计划单次任务

计划框架建立在 Java 定时器框架类的基础之上。因此,在解释如何使用计划框架以及如何实现它之前,我们将首先看看如何用这些类进行计划。

想像一个煮蛋计时器,在数分钟之后(这时蛋煮好了)它会发出声音提醒您。清单 1 中的代码构成了一个简单的煮蛋计时器的基本结构,它用 Java 语言编写:

清单 1. EggTimer 类




Java代码 
1.package org.tiling.scheduling.examples; 
2.import java.util.Timer; 
3.import java.util.TimerTask; 
4.public class EggTimer { 
5.private final Timer timer = new Timer(); 
6.private final int minutes; 
7.public EggTimer(int minutes) { 
8.this.minutes = minutes; 
9.} 
10.public void start() { 
11.timer.schedule(new TimerTask() { 
12.public void run() { 
13.playSound(); 
14.timer.cancel(); 
15.} 
16.private void playSound() { 
17.System.out.println("Your egg is ready!"); 
18.// Start a new thread to play a sound... 
19.} 
20.}, minutes * 60 * 1000); 
21.} 
22.public static void main(String[] args) { 
23.EggTimer eggTimer = new EggTimer(2); 
24.eggTimer.start(); 
25.} 
26.} 

EggTimer 实例拥有一个 Timer 实例,用于提供必要的计划。用 start() 方法启动煮蛋计时器后,它就计划了一个 TimerTask,在指定的分钟数之后执行。时间到了,Timer 就在后台调用 TimerTask 的 start() 方法,这会使它发出声音。在取消计时器后这个应用程序就会中止。

计划重复执行的任务

通过指定一个固定的执行频率或者固定的执行时间间隔,Timer 可以对重复执行的任务进行计划。不过,有许多应用程序要求更复杂的计划。例如,每天清晨在同一时间发出叫醒铃声的闹钟不能简单地使用固定的计划频率 86400000 毫秒(24 小时),因为在钟拨快或者拨慢(如果您的时区使用夏令时)的那些天里,叫醒可能过晚或者过早。解决方案是使用日历算法计算每日事件下一次计划发生的时间。而这正是计划框架所支持的。考虑清单 2 中的 AlarmClock 实现:

清单 2. AlarmClock 类




Java代码 
1.package org.tiling.scheduling.examples; 
2.import java.text.SimpleDateFormat; 
3.import java.util.Date; 
4.import org.tiling.scheduling.Scheduler; 
5.import org.tiling.scheduling.SchedulerTask; 
6.import org.tiling.scheduling.examples.iterators.DailyIterator; 
7.public class AlarmClock { 
8.private final Scheduler scheduler = new Scheduler(); 
9.private final SimpleDateFormat dateFormat = 
10.new SimpleDateFormat("dd MMM yyyy HH:mm:ss.SSS"); 
11.private final int hourOfDay, minute, second; 
12.public AlarmClock(int hourOfDay, int minute, int second) { 
13.this.hourOfDay = hourOfDay; 
14.this.minute = minute; 
15.this.second = second; 
16.} 
17.public void start() { 
18.scheduler.schedule(new SchedulerTask() { 
19.public void run() { 
20.soundAlarm(); 
21.} 
22.private void soundAlarm() { 
23.System.out.println("Wake up! " + 
24."It's " + dateFormat.format(new Date())); 
25.// Start a new thread to sound an alarm... 
26.} 
27.}, new DailyIterator(hourOfDay, minute, second)); 
28.} 
29.public static void main(String[] args) { 
30.AlarmClock alarmClock = new AlarmClock(7, 0, 0); 
31.alarmClock.start(); 
32.} 
33.} 



注意这段代码与煮蛋计时器应用程序非常相似。AlarmClock 实例拥有一个 Scheduler (而不是 Timer)实例,用于提供必要的计划。启动后,这个闹钟对 SchedulerTask (而不是 TimerTask)进行调度用以发出报警声。这个闹钟不是计划一个任务在固定的延迟时间后执行,而是用 DailyIterator 类描述其计划。在这里,它只是计划任务在每天上午 7:00 执行。下面是一个正常运行情况下的输出:

Wake up! It's 24 Aug 2003 07:00:00.023
Wake up! It's 25 Aug 2003 07:00:00.001
Wake up! It's 26 Aug 2003 07:00:00.058
Wake up! It's 27 Aug 2003 07:00:00.015
Wake up! It's 28 Aug 2003 07:00:00.002
...


DailyIterator 实现了 ScheduleIterator,这是一个将 SchedulerTask 的计划执行时间指定为一系列 java.util.Date 对象的接口。然后 next() 方法按时间先后顺序迭代 Date 对象。返回值 null 会使任务取消(即它再也不会运行)—— 这样的话,试图再次计划将会抛出一个异常。清单 3 包含 ScheduleIterator 接口:

清单 3. ScheduleIterator 接口




Java代码 
1.package org.tiling.scheduling; 
2.import java.util.Date; 
3.public interface ScheduleIterator { 
4.public Date next(); 
5.} 



DailyIterator 的 next() 方法返回表示每天同一时间(上午 7:00)的 Date 对象,如清单 4 所示。所以,如果对新构建的 next() 类调用 next(),那么将会得到传递给构造函数的那个日期当天或者后面一天的 7:00 AM。再次调用 next() 会返回后一天的 7:00 AM,如此重复。为了实现这种行为,DailyIterator 使用了 java.util.Calendar 实例。构造函数会在日历中加上一天,对日历的这种设置使得第一次调用 next() 会返回正确的 Date。注意代码没有明确地提到夏令时修正,因为 Calendar 实现(在本例中是 GregorianCalendar)负责对此进行处理,所以不需要这样做。

清单 4. DailyIterator 类




Java代码 
1.package org.tiling.scheduling.examples.iterators; 
2.import org.tiling.scheduling.ScheduleIterator; 
3.import java.util.Calendar; 
4.import java.util.Date; 
5./**
6.* A DailyIterator class returns a sequence of dates on subsequent days
7.* representing the same time each day.
8.*/ 
9.public class DailyIterator implements ScheduleIterator { 
10.private final int hourOfDay, minute, second; 
11.private final Calendar calendar = Calendar.getInstance(); 
12.public DailyIterator(int hourOfDay, int minute, int second) { 
13.this(hourOfDay, minute, second, new Date()); 
14.} 
15.public DailyIterator(int hourOfDay, int minute, int second, Date date) { 
16.this.hourOfDay = hourOfDay; 
17.this.minute = minute; 
18.this.second = second; 
19.calendar.setTime(date); 
20.calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); 
21.calendar.set(Calendar.MINUTE, minute); 
22.calendar.set(Calendar.SECOND, second); 
23.calendar.set(Calendar.MILLISECOND, 0); 
24.if (!calendar.getTime().before(date)) { 
25.calendar.add(Calendar.DATE, -1); 
26.} 
27.} 
28.public Date next() { 
29.calendar.add(Calendar.DATE, 1); 
30.return calendar.getTime(); 
31.} 
32.} 



实现计划框架

在上一节,我们学习了如何使用计划框架,并将它与 Java 定时器框架进行了比较。下面,我将向您展示如何实现这个框架。除了 清单 3 中展示的 ScheduleIterator 接口,构成这个框架的还有另外两个类 —— Scheduler 和 SchedulerTask 。这些类实际上在内部使用 Timer 和 SchedulerTask,因为计划其实就是一系列的单次定时器。清单 5 和 6 显示了这两个类的源代码:

清单 5. Scheduler




Java代码 
1.package org.tiling.scheduling; 
2.import java.util.Date; 
3.import java.util.Timer; 
4.import java.util.TimerTask; 
5.public class Scheduler { 
6.class SchedulerTimerTask extends TimerTask { 
7.private SchedulerTask schedulerTask; 
8.private ScheduleIterator iterator; 
9.public SchedulerTimerTask(SchedulerTask schedulerTask, 
10.ScheduleIterator iterator) { 
11.this.schedulerTask = schedulerTask; 
12.this.iterator = iterator; 
13.} 
14.public void run() { 
15.schedulerTask.run(); 
16.reschedule(schedulerTask, iterator); 
17.} 
18.} 
19.private final Timer timer = new Timer(); 
20.public Scheduler() { 
21.} 
22.public void cancel() { 
23.timer.cancel(); 
24.} 
25.public void schedule(SchedulerTask schedulerTask, 
26.ScheduleIterator iterator) { 
27.Date time = iterator.next(); 
28.if (time == null) { 
29.schedulerTask.cancel(); 
30.} else { 
31.synchronized(schedulerTask.lock) { 
32.if (schedulerTask.state != SchedulerTask.VIRGIN) { 
33.throw new IllegalStateException("Task already 
34.scheduled " + "or cancelled"); 
35.} 
36.schedulerTask.state = SchedulerTask.SCHEDULED; 
37.schedulerTask.timerTask = 
38.new SchedulerTimerTask(schedulerTask, iterator); 
39.timer.schedule(schedulerTask.timerTask, time); 
40.} 
41.} 
42.} 
43.private void reschedule(SchedulerTask schedulerTask, 
44.ScheduleIterator iterator) { 
45.Date time = iterator.next(); 
46.if (time == null) { 
47.schedulerTask.cancel(); 
48.} else { 
49.synchronized(schedulerTask.lock) { 
50.if (schedulerTask.state != SchedulerTask.CANCELLED) { 
51.schedulerTask.timerTask = 
52.new SchedulerTimerTask(schedulerTask, iterator); 
53.timer.schedule(schedulerTask.timerTask, time); 
54.} 
55.} 
56.} 
57.} 
58.} 


清单 6 显示了 SchedulerTask 类的源代码:




Java代码 
1.package org.tiling.scheduling; 
2.import java.util.TimerTask; 
3.public abstract class SchedulerTask implements Runnable { 
4.final Object lock = new Object(); 
5.int state = VIRGIN; 
6.static final int VIRGIN = 0; 
7.static final int SCHEDULED = 1; 
8.static final int CANCELLED = 2; 
9.TimerTask timerTask; 
10.protected SchedulerTask() { 
11.} 
12.public abstract void run(); 
13.public boolean cancel() { 
14.synchronized(lock) { 
15.if (timerTask != null) { 
16.timerTask.cancel(); 
17.} 
18.boolean result = (state == SCHEDULED); 
19.state = CANCELLED; 
20.return result; 
21.} 
22.} 
23.public long scheduledExecutionTime() { 
24.synchronized(lock) { 
25.return timerTask == null ? 0 : timerTask.scheduledExecutionTime(); 
26.} 
27.} 
28.} 

就像煮蛋计时器,Scheduler 的每一个实例都拥有 Timer 的一个实例,用于提供底层计划。Scheduler 并没有像实现煮蛋计时器时那样使用一个单次定时器,它将一组单次定时器串接在一起,以便在由 ScheduleIterator 指定的各个时间执行 SchedulerTask 类。

考虑 Scheduler 上的 public schedule() 方法 —— 这是计划的入口点,因为它是客户调用的方法(在 取消任务 一节中将描述仅有的另一个 public 方法 cancel())。通过调用 ScheduleIterator 接口的 next(),发现第一次执行 SchedulerTask 的时间。然后通过调用底层 Timer 类的单次 schedule() 方法,启动计划在这一时刻执行。为单次执行提供的 TimerTask 对象是嵌入的 SchedulerTimerTask 类的一个实例,它包装了任务和迭代器(iterator)。在指定的时间,调用嵌入类的 run() 方法,它使用包装的任务和迭代器引用以便重新计划任务的下一次执行。reschedule() 方法与 schedule() 方法非常相似,只不过它是 private 的,并且执行一组稍有不同的 SchedulerTask 状态检查。重新计划过程反复重复,为每次计划执行构造一个新的嵌入类实例,直到任务或者调度程序被取消(或者 JVM 关闭)。

类似于 TimerTask,SchedulerTask 在其生命周期中要经历一系列的状态。创建后,它处于 VIRGIN 状态,这表明它从没有计划过。计划以后,它就变为 SCHEDULED 状态,再用下面描述的方法之一取消任务后,它就变为 CANCELLED 状态。管理正确的状态转变 —— 如保证不对一个非 VIRGIN 状态的任务进行两次计划 —— 增加了 Scheduler 和 SchedulerTask 类的复杂性。在进行可能改变任务状态的操作时,代码必须同步任务的锁对象。

取消任务

取消计划任务有三种方式。第一种是调用 SchedulerTask 的 cancel() 方法。这很像调用 TimerTask 的 cancel()方法:任务再也不会运行了,不过已经运行的任务仍会运行完成。 cancel() 方法的返回值是一个布尔值,表示如果没有调用 cancel() 的话,计划的任务是否还会运行。更准确地说,如果任务在调用 cancel() 之前是 SCHEDULED 状态,那么它就返回 true。如果试图再次计划一个取消的(甚至是已计划的)任务,那么 Scheduler 就会抛出一个 IllegalStateException。

取消计划任务的第二种方式是让 ScheduleIterator 返回 null。这只是第一种方式的简化操作,因为 Scheduler 类调用 SchedulerTask 类的 cancel()方法。如果您想用迭代器而不是任务来控制计划停止时间时,就用得上这种取消任务的方式了。

第三种方式是通过调用其 cancel() 方法取消整个 Scheduler。这会取消调试程序的所有任务,并使它不能再计划任何任务。

扩展 cron 实用程序

可以将计划框架比作 UNIX 的 cron 实用程序,只不过计划次数的规定是强制性而不是声明性的。例如,在 AlarmClock 实现中使用的 DailyIterator 类,它的计划与 cron 作业的计划相同,都是由以 0 7 * * * 开始的 crontab 项指定的(这些字段分别指定分钟、小时、日、月和星期)。

不过,计划框架比 cron 更灵活。想像一个在早晨打开热水的 HeatingController 应用程序。我想指示它“在每个工作日上午 8:00 打开热水,在周未上午 9:00 打开热水”。使用 cron,我需要两个 crontab 项(0 8 * * 1,2,3,4,5 和 0 9 * * 6,7)。而使用 ScheduleIterator 的解决方案更简洁一些,因为我可以使用复合(composition)来定义单一迭代器。清单 7 显示了其中的一种方法:

清单 7. 用复合定义单一迭代器




Java代码 
1.int[] weekdays = new int[] { 
2.Calendar.MONDAY, 
3.Calendar.TUESDAY, 
4.Calendar.WEDNESDAY, 
5.Calendar.THURSDAY, 
6.Calendar.FRIDAY 
7.}; 
8.int[] weekend = new int[] { 
9.Calendar.SATURDAY, 
10.Calendar.SUNDAY 
11.}; 
12.ScheduleIterator i = new CompositeIterator( 
13.new ScheduleIterator[] { 
14.new RestrictedDailyIterator(8, 0, 0, weekdays), 
15.new RestrictedDailyIterator(9, 0, 0, weekend) 
16.} 
17.); 

RestrictedDailyIterator 类很像 DailyIterator,只不过它限制为只在一周的特定日子里运行,而一个 CompositeIterator 类取得一组 ScheduleIterators,并将日期正确排列到单个计划中。

有许多计划是 cron 无法生成的,但是 ScheduleIterator 实现却可以。例如,“每个月的最后一天”描述的计划可以用标准 Java 日历算法来实现(用 Calendar 类),而用 cron 则无法表达它。应用程序甚至无需使用 Calendar 类。在本文的源代码(请参阅 参考资料)中,我加入了一个安全灯控制器的例子,它按“在日落之前 15 分钟开灯”这一计划运行。这个实现使用了 Calendrical Calculations Software Package,用于计算当地(给定经度和纬度)的日落时间。

实时保证

在编写使用计划的应用程序时,一定要了解框架在时间方面有什么保证。我的任务是提前还是延迟执行?如果有提前或者延迟,偏差最大值是多少?不幸的是,对这些问题没有简单的答案。不过在实际中,它的行为对于很多应用程序已经足够了。下面的讨论假设系统时钟是正确的。

因为 Scheduler 将计划委托给 Timer 类,Scheduler 可以做出的实时保证与 Timer 的一样。Timer 用 Object.wait(long) 方法计划任务。当前线程要等待直到唤醒它,唤醒可能出于以下原因之一:

1.另一个线程调用对象的 notify() 或者 notifyAll() 方法。

2.线程被另一个线程中断。

3.在没有通知的情况下,线程被唤醒(称为 spurious wakeup,Joshua Bloch 的 Effective Java Programming Language Guide 一书中 Item 50 对其进行了描述 。

4.规定的时间已到。

对于 Timer 类来说,第一种可能性是不会发生的,因为对其调用 wait() 的对象是私有的。即便如此,Timer 实现仍然针对前三种提前唤醒的原因进行了保护,这样保证了线程在规定时间后才唤醒。目前,Object.wait(long) 的文档注释声明,它会在规定的时间“前后”苏醒,所以线程有可能提前唤醒。在本例中,Timer 会让另一个 wait() 执行(scheduledExecutionTime - System.currentTimeMillis())毫秒,从而保证任务永远不会提前执行。任务是否会延迟执行呢?会的。延迟执行有两个主要原因:线程计划和垃圾收集。

Java 语言规范故意没有对线程计划做严格的规定。这是因为 Java 平台是通用的,并针对于大范围的硬件及其相关的操作系统。虽然大多数 JVM 实现都有公平的线程调度程序,但是这一点没有任何保证 —— 当然,各个实现都有不同的为线程分配处理器时间的策略。因此,当 Timer 线程在分配的时间后唤醒时,它实际执行其任务的时间取决于 JVM 的线程计划策略,以及有多少其他线程竞争处理器时间。因此,要减缓任务的延迟执行,应该将应用程序中可运行的线程数降至最少。为了做到这一点,可以考虑在一个单独的 JVM 中运行调度程序。

对于创建大量对象的大型应用程序,JVM 花在垃圾收集(GC)上的时间会非常多。默认情况下,进行 GC 时,整个应用程序都必须等待它完成,这可能要有几秒钟甚至更长的时间(Java 应用程序启动器的命令行选项 -verbose:gc 将导致向控制台报告每一次 GC 事件)。要将这些由 GC 引起的暂停(这可能会影响快速任务的执行)降至最少,应该将应用程序创建的对象的数目降至最低。同样,在单独的 JVM 中运行计划代码是有帮助的。同时,可以试用几个微调选项以尽可能地减少 GC 暂停。例如,增量 GC 会尽量将主收集的代价分散到几个小的收集上。当然这会降低 GC 的效率,但是这可能是时间计划的一个可接受的代价。

被计划到什么时候?

如果任务本身能监视并记录所有延迟执行的实例,那么对于确定任务是否能按时运行会很有帮助。SchedulerTask 类似于 TimerTask,有一个 scheduledExecutionTime() 方法,它返回计划任务最近一次执行的时间。在任务的 run() 方法开始时,对表达式 System.currentTimeMillis() - scheduledExecutionTime() 进行判断,可以让您确定任务延迟了多久执行(以毫秒为单位)。可以记录这个值,以便生成一个关于延迟执行的分布统计。可以用这个值决定任务应当采取什么动作 —— 例如,如果任务太迟了,那么它可能什么也不做。在遵循上述原则的情况下,如果应用程序需要更严格的时间保证,可参考 Java 的实时规范。

结束语

在本文中,我介绍了 Java 定时器框架的一个简单增强,它使得灵活的计划策略成为可能。新的框架实质上是更通用的 cron —— 事实上,将 cron 实现为一个 ScheduleIterator 接口,用以替换单纯的 Java cron,这是非常有用的。虽然没有提供严格的实时保证,但是许多需要计划定期任务的通用 Java 应用程序都可以使用这一框架。


如何实现在每小时的整点执行一个任务
______________




Java代码 
1.import   java.util.Timer;   
2.  import   java.util.TimerTask;   
3.     
4.  public   class   TimerTest   {   
5.         
6.      public   static   void   main(String[]   args)   {   
7.          test2   test   =   new   test2();   
8.          Timer   time   =   new   Timer();   
9.          time.scheduleAtFixedRate(test.new   RunTimer(),5000,200);   
10.          time.schedule(test.new   RunTimer(),5000,1000);   
11.      }   
12.     
13.      class   RunTimer   extends   TimerTask   {   
14.          int   i   =   0;   
15.          public   void   run()   {   
16.              System.out.println(""   +   (i++));   
17.          }   
18.     
19.      }   
20.  }   

 
__________________
5000代表delay的时间,如何确定delay5000毫秒之后就是整点呢?
用quartz吧

我后来是通过这种方法来做的,不知道行不行(给我一个确认答复也给分): 



Java代码 
1.Calendar   CurrentTime=Calendar.getInstance();   
2.CurrentTime.set(Calendar.HOUR,0);   
3.CurrentTime.set(Calendar.MINUTE,0);   
4.CurrentTime.set(Calendar.MILLISECOND,0);   
5.CurrentTime.add(Calendar.HOUR,1);   
6.Date   NextHour=CurrentTime.getTime();   
7.timer.schedule(new   RenameTask(),NextHour,JOB_INTERNAL); 


________________




Java代码 
1.import   java.util.Calendar;   
2.  import   java.util.Date;   
3.  import   java.util.Timer;   
4.     
5.  public   class   OneHour   {   
6.     
7.  private   final   static   long   JOB_INTERNAL   =   1000   *   60   *   60;   
8.     
9.  /**  
10.    *   @param   args  
11.    */   
12.  public   static   void   main(String[]   args)   {   
13.  //   TODO   Auto-generated   method   stub   
14.  Timer   timer   =   new   Timer();   
15.  //   timer.scheduleAtFixedRate(new   MyTask,   );   
16.     
17.  Calendar   currentTime   =   Calendar.getInstance();   
18.  currentTime.setTime(new   Date());   
19.     
20.  int   currentHour   =   currentTime.get(Calendar.HOUR);   
21.     
22.  currentTime.set(Calendar.HOUR,   currentHour   +   1);   
23.  currentTime.set(Calendar.MINUTE,   0);   
24.  currentTime.set(Calendar.SECOND,   0);   
25.  currentTime.set(Calendar.MILLISECOND,   0);   
26.     
27.  Date   NextHour   =   currentTime.getTime();   
28.  // System.out.println(NextHour);   
29.     
30.  timer.scheduleAtFixedRate(new   MyTask(),   NextHour,   JOB_INTERNAL);   
31.  }   
32.     
33.  }   
34.     
35.  import   java.util.Date;   
36.  import   java.util.TimerTask;   
37.     
38.     
39.  class   MyTask   extends   TimerTask   {   
40.     
41.  @Override   
42.  public   void   run()   {   
43.  //   TODO   Auto-generated   method   stub   
44.  System.out.println(new   Date());   
45.  }   
46.     
47.  }   

   
  这个应该差不多了,   还有不要用Schedule().

____________________

linux、unix可以用cron设置定时任务



关于java中使用timer类定时发送消息的问题(如何自定义起始时间?)

源程序如下: 



Java代码 
1. import   java.util.*;   
2.     
3.  public   class   hi   {   
4.  public   static   void   main(String   args[])     
5.  throws   java.io.IOException   {   
6.  TimerTask   task   =   new   TimerTask()   {   
7.  public   void   run()   {   
8.  System.out.println("Hi");   
9.  }   
10.  };   
11.  Timer   timer   =   new   Timer();   
12.  timer.schedule(task,   0,   2000);//定时发送   
13.  System.out.println("Press   ENTER   to   stop");   
14.  System.in.read(new   byte[10]);   
15.  timer.cancel();   
16.  }   
17.  }   
18.     
19.  请问以上程序如何修改为可以自定义起始时间呢?   
20.     
21.  timer.schedule(task,   0,   2000)中我设置的时间0开始     
22.     
23.  不知道如何根据外部输入而确定时间的方法.   
24.  求教. 
25. 
26.______________________ 
27. 
28.这样做没有多大意义啊,你完全可以通过定义时间来限制何时启动 
29. 
30.*   @param   task       task   to   be   scheduled.   
31.            *   @param   firstTime   First   time   at   which   task   is   to   be   executed.   
32.            *   @param   period   time   in   milliseconds   between   successive   task   executions.   
33.            *   @throws   IllegalArgumentException   if   <tt>time.getTime()</tt>   is   negative.   
34.            *   @throws   IllegalStateException   if   task   was   already   scheduled   or   
35.            *                   cancelled,   timer   was   cancelled,   or   timer   thread   terminated.   
36.            */   
37.          public   void   schedule(TimerTask   task,   Date   firstTime,   long   period)   {   
38.                  if   (period   <=   0)   
39.                          throw   new   IllegalArgumentException("Non-positive   period.");   
40.                  sched(task,   firstTime.getTime(),   -period);   
41.          } 


_________________

scheduleAtFixedRate 
  public   void   scheduleAtFixedRate(TimerTask   task, 
                                                                  Date   firstTime,
                                                                   long   period)Schedules   the   specified   task   for   repeated   fixed-rate   execution,   beginning   at   the   specified   time.   Subsequent   executions   take   place   at   approximately   regular   intervals,   separated   by   the   specified   period.  
   In   fixed-rate   execution,   each   execution   is   scheduled   relative   to   the   scheduled   execution   time   of   the   initial   execution.   If   an   execution   is   delayed   for   any   reason   (such   as   garbage   collection   or   other   background   activity),   two   or   more   executions   will   occur   in   rapid   succession   to   "catch   up."   In   the   long   run,   the   frequency   of   execution   will   be   exactly   the   reciprocal   of   the   specified   period   (assuming   the   system   clock   underlying   Object.wait(long)   is   accurate).  
    
  Fixed-rate   execution   is   appropriate   for   recurring   activities   that   are   sensitive   to   absolute   time,   such   as   ringing   a   chime   every   hour   on   the   hour,   or   running   scheduled   maintenance   every   day   at   a   particular   time.   It   is   also   appropriate   for   for   recurring   activities   where   the   total   time   to   perform   a   fixed   number   of   executions   is   important,   such   as   a   countdown   timer   that   ticks   once   every   second   for   ten   seconds.   Finally,   fixed-rate   execution   is   appropriate   for   scheduling   multiple   repeating   timer   tasks   that   must   remain   synchronized   with   respect   to   one   another.  
    
   
  Parameters: 
  task   -   task   to   be   scheduled. 
  firstTime   -   First   time   at   which   task   is   to   be   executed. 
  period   -   time   in   milliseconds   between   successive   task   executions.  
   Throws:   
  IllegalArgumentException   -   if   time.getTime()   is   negative.   
  IllegalStateException   -   if   task   was   already   scheduled   or   cancelled,   timer   was   cancelled,   or   timer   thread   terminated.
  

______________________

可以设定开始时间的 
  schedule有好多重载方法 
public   void   schedule(TimerTask   task, 
                                            Date   firstTime, 
                                            long   period)

_______________________

用Quartz吧,可以让一个任务在特定的时间执行。 
  spring有集成

分享到:
.

ExtJs 实现动态列,动态多表头 在这里添加 ... | 【原创】Spring中配置任务调度器,任务随系 ...

2010-07-30 15:25
浏览 1735
评论(2)
收藏
分类:编程语言
相关推荐


评论


2 楼 NeverGiveUpToChange 2013-01-15   引用

非常的不错,学习学习…………


1 楼 sushi0k 2012-01-05   引用

你好,我看了这篇文章,对timer的分析很详细。
我想请教,有没有对timer性能分析的文章。不知道怎么的,timer会挂掉。
有没有什么办法让timer在报错的时候继续走。


发表评论







表情图标



字体颜色: 标准深红红色橙色棕色黄色绿色橄榄青色蓝色深蓝靛蓝紫色灰色白色黑色 字体大小: 标准1 (xx-small)2 (x-small)3 (small)4 (medium)5 (large)6 (x-large)7 (xx-large) 对齐: 标准居左居中居右

提示:选择您需要装饰的文字, 按上列按钮即可添加上相应的标签
.
(快捷键 Alt+S / Ctrl+Enter)






Mr.Cheney

浏览: 52846 次
性别:
来自: 武汉

发短消息关注


最近访客 更多访客>>




hoochiang




sunnykaho




sbgeeq




dylinshi126
.

文章分类
■全部博客 (142)
■java综合 (51)
■Struts1 (4)
■Oracle (9)
■环境配置 (14)
■Hibernate (6)
■javascript (11)
■Spring (3)
■Oracle常用傻瓜问题1000问 (13)
■jquery (6)
■Android (3)
■DWR (3)
■Sql server 2005 (1)
■JasperReport (3)
■sturts2 (3)
■ExtJS (2)
■SQL (2)
■SQLITE (1)
■WebService (1)
■java队列 (2)
■Socket (1)
■JSTL标签+OGNL标签 (1)
■乱码 (1)


社区版块
■我的资讯 (0)
■我的论坛 (37)
■我的问答 (13)


存档分类
■2012-12 (1)
■2012-10 (1)
■2012-04 (1)
■更多存档...


评论排行榜
■android dip与px之间的换算工具


最新评论
移动硬盘: 遇到同樣的錯誤,已使用此方法解決成功,謝謝博主。
OracleDBconsoleorcl无法启动解决方案
NeverGiveUpToChange: 非常的不错,学习学习…………
java中timer用法
robingdo: 回去试试。谢谢分享
OracleDBconsoleorcl无法启动解决方案
540933120: [img][/img]
在action或者Servlet中如何得到项目的webRoot路径
Mr.Cheney: <META name=GENERATOR content ...
android dip与px之间的换算工具

.


--------------------------------------------------------------------------------
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。若作者同意转载,必须以超链接形式标明文章原始出处和作者。
© 2003-2012 ITeye.com. All rights reserved. [ 京ICP证110151号 京公网安备110105010620 ]
.
分享到:
评论

相关推荐

    Java定时器

    Java定时器是Java编程语言中用于执行特定任务的调度工具,它允许程序员在指定的时间间隔后执行特定的代码块或任务。在Java中,我们主要使用`java.util.Timer`类和`java.util.TimerTask`类来实现定时器功能。这两个类...

    Java定时器的使用 Java程序

    Java定时器(java.util.Timer)是Java标准库中用于调度任务执行的重要工具,它允许我们按照预设的时间间隔执行特定的任务。在Java程序设计中,定时器常常用于实现周期性的任务,比如定时备份数据、定时检查系统状态...

    JAVA定时器JAVA定时器

    JAVA定时器,只要服务开启,就能指定某些代码在某个时刻执行,例如:监狱里罪犯的余刑天数,每天都要减少,就可以设置一个定时器在每天的23:59:59来执行减少余刑天数的天。

    Java定时器框架(Quartz)

    Java定时器框架Quartz是Java开发中用于任务调度的一个强大工具,它允许开发者精确地控制任务的执行时间,包括一次性任务和周期性任务。Quartz以其灵活性和稳定性,在企业级应用中广泛使用,尤其在需要定期执行后台...

    JAVA定时器JAVA定时器.pdf

    JAVA定时器 JAVA定时器是一种基于Quartz框架的任务调度器,用于在指定的时间执行特定的任务。在 Spring 框架中,JAVA定时器可以与Quartz框架集成,实现自动执行任务的功能。 1. JAVA定时器的基本概念 JAVA定时器...

    java 定时器(Timer)

    Java定时器(Timer)是Java Swing库中的一个类,它提供了调度任务在未来某个时间执行的能力。这个类主要用于在GUI应用程序中实现定时触发某些操作,比如更新界面、执行动画或者执行周期性的后台任务。Timer类结合了...

    Java定时器简例

    ### Java定时器实现详解 在Java编程中,定时任务是常见的需求之一,无论是服务器的定期维护、数据同步,还是客户端的动画更新等场景,都需要用到定时器来精确控制任务的执行时间。本文将深入解析一个基于Java的简单...

    java定时器设置及停止的方法

    在Java编程中,定时任务是不可或缺的一部分,它们用于执行周期性操作,如数据备份、监控、清理等。本文将深入探讨如何在Java中设置和停止定时任务,主要关注`java.util.Timer`和`java.util.TimerTask`,以及更现代的...

    java定时器的使用

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

    java 定时器 spring 定时器

    Java定时器和Spring定时器是Java开发中用于执行周期性任务的重要工具,它们在系统维护、数据同步、报告生成等场景中发挥着关键作用。本文将深入探讨这两个概念,以及如何在Spring框架中配置和使用定时器。 首先,...

    java定时器.rar

    Java定时器(Timer)是Java语言中用于调度任务的一个重要工具,它可以帮助我们在特定时间执行一次或重复执行某个任务。这个“java定时器.rar”压缩包可能包含了关于如何使用Java定时器的相关示例代码和教程。 Java...

    java定时器服务!!

    Java定时器服务是Java平台中用于执行定时任务的关键组件,它允许开发者安排未来或定期的任务执行。在Java中,我们通常使用`java.util.Timer`类和`java.util.TimerTask`类来实现定时服务。这两个类提供了创建、调度和...

    简单易用的java定时器scheduler,有完整配置说明

    Java定时器,通常被称为Scheduler,是Java开发中用于执行定期任务的重要工具。它允许开发者在特定的时间间隔或者按照预设的计划执行代码,这在处理数据同步、日志清理、发送通知等场景中非常常见。在Java中,我们...

    JAVA定时器时间抓取

    Java定时器和时间处理是Java开发中的重要组成部分,特别是在需要执行周期性任务或者对时间有精确控制的应用场景中。本文将深入探讨Java定时器(Timer)的使用以及如何获取和处理年月日、时间节点等时间相关的信息。 ...

    java定时器(timer类使用详解)

    Java定时器,也被称为`Timer`类,是Java标准库中的一个强大工具,它允许开发者在指定的时间间隔执行任务,从而实现定时操作。这个类在`java.util`包中定义,是实现定时任务调度的核心。在本文中,我们将深入探讨`...

    Java定时器数字时钟

    Java定时器数字时钟是一种基于Java编程语言实现的软件,它可以模拟系统时间并实时更新显示。这个程序是在Eclipse 7.5集成开发环境中编写的,Eclipse是Java开发者广泛使用的IDE,它提供了丰富的功能,如代码编辑、...

    Java定时器Timer简述共8页.pdf.zip

    Java定时器(Timer)是Java语言提供的一种用于执行定时任务的工具类,它位于java.util包下。在Java编程中,我们有时需要在特定的时间间隔内执行某些操作,例如每隔一段时间更新数据、发送通知或者执行定期维护等。这...

Global site tag (gtag.js) - Google Analytics