Java Timer TimerTask示例

Java java.util.Timer是一个实用程序类,可用于调度将来某个时间执行的线程。Java Timer类可用于计划要一次运行的任务或定期运行的任务。

Java TimerTask

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

Java计时器示例

java计时器示例,java计时器,java timertask,java timertask示例

Java Timer类是线程安全的,多个线程可以共享一个Timer对象,而无需外部同步。Timer类使用java.util.TaskQueue以给定的定期间隔添加任务,并且在任何时候只能有一个线程运行TimerTask,例如,如果要创建一个每10秒运行一次的Timer,但单线程执行需要20秒,然后Timer对象将继续向队列添加任务,一旦一个线程完成,它将通知队列,另一个线程将开始执行。

Java Timer类使用Object wait和notify方法来安排任务。

这是一个简单的Java Timer和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 {
            //assuming it takes 20 secs to complete the task
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String args[]){
        TimerTask timerTask = new MyTimerTask();
        //running timer task as daemon thread
        Timer timer = new Timer(true);
        timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
        System.out.println("TimerTask started");
        //cancel after sometime
        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 Timer对象被安排为每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的快速综述。

猜你喜欢

转载自blog.csdn.net/xingqibaing/article/details/84063080
今日推荐