Java多线程案例之定时器详解
简介
定时器(Timer)是 Java 多线程编程中的常用工具,它可以让我们方便地实现定时任务。如果想要在 Java 中实现定时器,可以使用 JavaSE 中提供的 Timer 类或者 ScheduledExecutorService 接口。
在这篇文章中,我们将深入探讨 Java 多线程编程中的定时器,并通过多个示例说明如何使用定时器实现定时任务。
Timer 类
Timer 类是 JavaSE 中专门用于定时器编程的一个类,通过 Timer 类可以创建一个任务调度器,可以按指定时间周期执行任务。Timer 类提供了以下 4 个方法用于创建定时器任务:
-
schedule(TimerTask task, long delay)
:表示在 delay 毫秒后执行一次 task 任务。 -
schedule(TimerTask task, long delay, long period)
:表示在 delay 毫秒后第一次执行 task 任务,然后每隔 period 毫秒执行一次。 -
schedule(TimerTask task, Date time)
:表示在 time 时间点执行一次 task 任务。 -
schedule(TimerTask task, Date firstTime, long period)
:表示在 firstTime 时间点第一次执行 task 任务,然后每隔 period 毫秒执行一次。
这里的 TimerTask
是一个抽象类,需要我们继承并实现其中的 run()
方法,在 run()
方法中实现需要定时执行的业务逻辑。
示例一:用 Timer 实现定时器
以下示例演示了使用 JavaSE 中的 Timer 类实现定时输出当前时间的任务:
import java.util.Timer;
import java.util.TimerTask;
public class MyTimerTask extends TimerTask {
@Override
public void run() {
System.out.println("现在的时间是:" + System.currentTimeMillis());
}
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new MyTimerTask(), 0, 1000);
}
}
在例子中,我们创建了一个继承自 TimerTask
的子类 MyTimerTask
,并在其中实现了 run()
方法,在 run()
方法中实现了输出当前时间的业务逻辑。然后,在 main()
方法中创建了一个 Timer 类并使用 schedule()
方法来启动定时器任务。
ScheduledExecutorService 接口
虽然 Timer 类提供了一种简单的方式实现定时器,但是因为 Timer 类是基于单线程实现的,当业务逻辑较为复杂时,可能需要多个 Timer 实例才能完成定时任务。
为了解决这个问题,JavaSE 还提供了一个更加强大的定时器实现方式 —— ScheduledExecutorService 接口。与 Timer 类不同,ScheduledExecutorService 是基于多线程实现的,可以支持多个定时任务同时执行,并且具有更加丰富的定时任务管理方式。
ScheduledExecutorService 接口提供了四种定时任务调度方法:
-
schedule(Callable<V>, long, TimeUnit)
:在 delay 时间后执行任务,并返回结果。 -
schedule(Runnable, long, TimeUnit)
:在 delay 时间后执行任务。 -
scheduleAtFixedRate(Runnable, long, long, TimeUnit)
:在延迟 delay 时长后开始执行任务,然后按照指定的周期进行重复执行。 -
scheduleWithFixedDelay(Runnable, long, long, TimeUnit)
:在延迟 delay 时长后开始执行任务,然后根据指定的延迟时间将任务延迟执行。
示例二:用 ScheduledExecutorService 接口实现定时器
以下示例演示了使用 JavaSE 中的 ScheduledExecutorService 接口实现定时输出当前时间的任务:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class MyScheduler {
public static void main(String[] args) {
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
Runnable task = new Runnable() {
public void run() {
System.out.println("现在的时间是:" + System.currentTimeMillis());
}
};
executor.scheduleAtFixedRate(task, 0, 1000, TimeUnit.MILLISECONDS);
}
}
在例子中,我们创建了一个 ScheduledExecutorService 实例并使用 scheduleAtFixedRate()
方法来启动定时器任务,这个任务每隔1秒钟输出当前时间。
结论
总的来说,Java 多线程编程中的定时器是一种非常重要的工具,在实际开发中经常用到。在本文中,我们主要介绍了 JavaSE 中提供的 Timer 类和 ScheduledExecutorService 接口,以及使用这两个工具实现定时任务的方法。针对不同的需求可以选择不同的实现方式来完成定时任务,程序员可以根据自己的实际需求来选择适合自己的实现方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程案例之定时器详解 - Python技术站