Java线程中的Timer和TimerTask原理详解

Java线程中的Timer和TimerTask原理详解

TimerTask是Java中的一个类,它允许开发者在指定时间间隔内重复执行或延迟执行特定的任务。

类定义:TimerTask类位于java.util包中,它直接继承了java.lang.Object类,并且实现了java.lang.Runnable接口。
任务类型:TimerTask是一种可以由定时器(Timer)调度执行的任务。这些任务可以是一次性的,也可以是重复执行的。
核心方法
run():这是TimerTask类中的抽象方法,需要在子类中实现。该方法包含了任务的具体逻辑,当任务被执行时,run()方法会被调用。
cancel():此方法用于取消任务。如果任务尚未开始执行,那么它将永远不会执行;如果任务已经开始执行,那么它会继续执行到结束,但之后不会再被调度执行。
scheduledExecutionTime():此方法返回任务最近一次实际执行的调度时间。如果任务正在执行,那么返回值就是正在运行的任务的调度执行时间。
使用步骤
创建自定义任务类:继承TimerTask类,并重写run()方法,将任务的具体逻辑放入其中。
创建Timer对象:使用Timer类来创建一个定时器对象。
安排任务执行:通过Timer对象的schedule()方法,将自定义的任务类实例(TimerTask对象)安排到定时器中进行执行。可以设置任务的开始时间、执行间隔等参数。
注意事项
TimerTask任务是通过Timer类的后台线程来执行的,因此不会阻塞主线程。
如果在任务的run()方法内部调用了cancel()方法,那么可以确保这个任务将不会再被调度执行(但正在执行的任务会继续执行到结束)。
Timer和TimerTask是在Java 5中引入的传统的定时任务机制。在Java 5及以后的版本中,推荐使用ScheduledExecutorService接口和ScheduledThreadPoolExecutor类来执行定时任务,因为它们提供了更灵活和功能更强大的定时任务功能。
示例代码
以下是一个简单的TimerTask使用示例:

import java.util.Timer;  
import java.util.TimerTask;  
  
public class TimerTaskExample {  
    public static void main(String[] args) {  
        Timer timer = new Timer();  
        TimerTask task = new TimerTask() {  
            @Override  
            public void run() {  
                System.out.println("Task executed at: " + new java.util.Date());  
                // 可以在这里添加任务的具体逻辑  
            }  
        };  
        // 安排任务在延迟0毫秒后开始执行,并每隔1000毫秒重复执行一次  
        timer.schedule(task, 0, 1000);  
    }  
}

在这个示例中,我们创建了一个Timer对象和一个TimerTask匿名子类实例。通过调用Timer对象的schedule()方法,我们将任务安排为在启动后立即执行,并且每隔1000毫秒重复执行一次。每次执行任务时,都会打印出当前的时间。

jdk自带的定时器
Java 定时器的原理是通过一个后台线程来实现的。这个后台线程会根据指定的时间间隔或固定的执行时间,在后台执行相应的任务。
对于 java.util.Timer 类,它内部维护了一个后台线程,这个线程会根据预定的时间间隔来执行任务。Timer 类提供了 schedule() 和 scheduleAtFixedRate() 等方法来设置定时任务,并可以指定任务首次执行的延迟时间。在 Timer 执行定时任务时,它会启动一个新的线程来执行该任务。
在 Java 方法中启动定时器有多种方式,以下是两种常用的方式:

  1. 使用 java.util.Timer 类:
    javaCopy Codeimport java.util.Timer;
    import java.util.TimerTask;
public class TimerExample {
    public static void main(String[] args) {
        Timer timer = new Timer();

        // 创建一个定时任务
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                // 定时任务要执行的操作
                System.out.println("定时器任务执行了");
            }
        };

        // 启动定时器,延迟 0ms 后开始执行,每隔 1000ms 执行一次
        timer.schedule(task, 0, 1000);
    }
}

示例代码:

Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
// 定时任务的逻辑
System.out.println(“定时任务执行”);
}
}, delay, period);
对于 java.util.concurrent.ScheduledExecutorService 类,它是 Java 5 引入的用于调度任务的工具类。它也使用了后台线程池来执行定时任务。ScheduledExecutorService 提供了 schedule() 和 scheduleAtFixedRate() 等方法用于设置定时任务,同样也可以指定任务首次执行的延迟时间。

(1)、代码如下:

package com.sundy.task;

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

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyTimerTask implements ServletContextListener{
private Timer timer;
@Override
public void contextDestroyed(ServletContextEvent arg0) {
if(timer!=null) timer.cancel();
}

@Override
public void contextInitialized(ServletContextEvent arg0) {
	timer = new Timer();
	timer.schedule(new TimerTask() {
		
		@Override
		public void run() {
			work();
		}
	}, 1000, 15*1000);// 一秒后执行,间隔十五秒执行一次。
}

private void work() {
	System.out.println("定时任务....");
}

}

(2)、需要在web.xml中增加

com.sundy.task.MyTimerTask

猜你喜欢

转载自blog.csdn.net/Fireworkit/article/details/143320448