Java TimerTask完全指南:计时器与定时任务实现教程

Java的java.util.Timer是一个实用类,可以用于在将来的某个时间安排一个线程执行。Java Timer类可用于安排一次性运行任务或定期间隔运行任务。

Java 定时任务

java.util.TimerTask 是一个抽象类,实现了 Runnable 接口,我们需要继承这个类来创建我们自己的 TimerTask,可以使用 java Timer 类进行调度。

Java定时器示例

Java计时器类是线程安全的,多个线程可以共享一个计时器对象而无需进行外部同步。计时器类使用java.util.TaskQueue在给定的固定间隔添加任务,并且在任何时候只能有一个线程运行TimerTask,例如如果您创建了一个每10秒运行一次的计时器,但单个线程执行需要20秒,则计时器对象将持续向队列中添加任务,并且一旦一个线程完成,它将通知队列并启动另一个线程执行。Java计时器类使用Object的wait和notify方法来安排任务。以下是Java计时器和TimerTask示例的简单程序。

package com.Olivia.threads;

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

public class MyTimerTask extends TimerTask {

    @Override
    public void run() {
        System.out.println("计时器任务开始于:"+new Date());
        completeTask();
        System.out.println("计时器任务结束于:"+new Date());
    }

    private void completeTask() {
        try {
            //假设完成任务需要20秒
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String args[]){
        TimerTask timerTask = new MyTimerTask();
        //作为守护线程运行计时器任务
        Timer timer = new Timer(true);
        timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
        System.out.println("计时器任务已启动");
        //一段时间后取消
        try {
            Thread.sleep(120000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        timer.cancel();
        System.out.println("计时器任务已取消");
        try {
            Thread.sleep(30000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

请注意,一个线程执行将需要20秒,但Java Timer对象被安排每10秒运行一次任务。以下是程序的输出结果:

计时器任务已启动
计时器任务开始于:Wed Dec 26 19:16:39 PST 2012
计时器任务结束于:Wed Dec 26 19:16:59 PST 2012
计时器任务开始于:Wed Dec 26 19:16:59 PST 2012
计时器任务结束于:Wed Dec 26 19:17:19 PST 2012
计时器任务开始于:Wed Dec 26 19:17:19 PST 2012
计时器任务结束于:Wed Dec 26 19:17:39 PST 2012
计时器任务开始于:Wed Dec 26 19:17:39 PST 2012
计时器任务结束于:Wed Dec 26 19:17:59 PST 2012
计时器任务开始于:Wed Dec 26 19:17:59 PST 2012
计时器任务结束于:Wed Dec 26 19:18:19 PST 2012
计时器任务开始于:Wed Dec 26 19:18:19 PST 2012
计时器任务已取消
计时器任务结束于:Wed Dec 26 19:18:39 PST 2012

输出确定如果一个任务已经执行,计时器将等待它完成,一旦完成,它会从队列中再次开始下一个任务。可以创建Java Timer对象来作为守护线程运行相关任务。取消计时器使用Timer cancel()方法终止计时器并丢弃所有计划任务,但它不会干扰正在执行的任务并允许其完成。如果计时器运行为守护线程,无论我们是否取消它,只要所有用户线程都执行完毕,它就会终止。Timer类包含几个schedule()方法,用于在指定日期运行一次任务或在一定延迟后运行任务。有几种scheduleAtFixedRate()方法,可以以固定间隔定期运行任务。在使用定时器调度任务时,应该确保时间间隔大于正常线程执行的时间,否则任务队列大小将不断增长,最终任务将一直执行。这就是关于Java Timer和Java TimerTask的快速概述。

bannerAds