Java计时器Timer TimerTask示例

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

Java TimerTask

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

Java Timer 示例

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

package com.journaldev.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("Timer task started at:"+new Date());
        completeTask();
        System.out.println("Timer task finished at:"+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("TimerTask started");
        //一段时间后取消
        try {
            Thread.sleep(120000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        timer.cancel();
        System.out.println("TimerTask cancelled");
        try {
            Thread.sleep(30000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

请注意,一个线程执行将需要20秒,但Java计时器对象被调度为每10秒运行一次任务。以下是程序的输出:

TimerTask started
Timer task started at:Wed Dec 26 19:16:39 PST 2012
Timer task finished at:Wed Dec 26 19:16:59 PST 2012
Timer task started at:Wed Dec 26 19:16:59 PST 2012
Timer task finished at:Wed Dec 26 19:17:19 PST 2012
Timer task started at:Wed Dec 26 19:17:19 PST 2012
Timer task finished at:Wed Dec 26 19:17:39 PST 2012
Timer task started at:Wed Dec 26 19:17:39 PST 2012
Timer task finished at:Wed Dec 26 19:17:59 PST 2012
Timer task started at:Wed Dec 26 19:17:59 PST 2012
Timer task finished at:Wed Dec 26 19:18:19 PST 2012
Timer task started at:Wed Dec 26 19:18:19 PST 2012
TimerTask cancelled
Timer task finished at:Wed Dec 26 19:18:39 PST 2012

输出确认,如果任务已经在执行,Timer将等待其完成,一旦完成,它将从队列中开始下一个任务。可以创建Java Timer对象以将相关任务作为守护线程运行。Timer cancel()方法用于终止定时器并丢弃任何已计划的任务,但它不会干扰当前正在执行的任务并让其完成。如果定时器作为守护线程运行,无论是否取消,它都会在所有用户线程完成执行后立即终止。Timer类包含多个schedule()方法,用于按给定日期或延迟一段时间后运行任务。还有几个scheduleAtFixedRate()方法,以一定的间隔周期性地运行任务。在使用Timer调度任务时,应确保时间间隔大于正常线程执行时间,否则任务队列大小将不断增长,最终任务将一直执行。这就是关于Java Timer和Java TimerTask的简要概述。

Source:
https://www.digitalocean.com/community/tutorials/java-timer-timertask-example