掌握Java定时器,提高开发效率!

作者:银川麻将开发公司 阅读:22 次 发布时间:2025-07-18 21:12:58

摘要:随着互联网技术的不断发展和应用范围的不断拓展,Java已成为重要的开发语言之一,而Java开发中定时任务的处理也越发重要。如何掌握Java定时器,提高开发效率呢?下面就和大家一起分享Java定时器的相关知识。一、Java定时器介绍Java中的定时器是一种功能强大的工具,通过它可以按照规定...

随着互联网技术的不断发展和应用范围的不断拓展,Java已成为重要的开发语言之一,而Java开发中定时任务的处理也越发重要。如何掌握Java定时器,提高开发效率呢?下面就和大家一起分享Java定时器的相关知识。

掌握Java定时器,提高开发效率!

一、Java定时器介绍

Java中的定时器是一种功能强大的工具,通过它可以按照规定的时间间隔进行操作,如执行任务,运行自动化测试脚本等等。Java定时器的原理是基于“程序休眠与唤醒”的机制实现的,通过对休眠时间的控制来实现定时功能。

二、Java定时器的基本用法

Java定时器主要有两种实现方法:Timer和ScheduledExecutorService,这里我们以Timer类来介绍 Java定时器的基本用法。

1.创建定时任务

在 Java 中,通过 Timer.schedule()方法添加定时任务,方法原型如下:

public void schedule(TimerTask task, Date time)

public void schedule(TimerTask task, Date firstTime, long period)

public void schedule(TimerTask task, long delay)

public void schedule(TimerTask task, long delay, long period)

该方法是 Timer 中最基本的方法,它的参数让我们可以精确地描述所要执行的任务,并决定该任务何时被执行。

我们先通过创建一个 TimerTask 子类SimpleTask实现定时任务的逻辑。

import java.util.TimerTask;

public class SimpleTask extends TimerTask {

@Override

public void run() {

System.out.println("这是一个定时输出信息!"+System.currentTimeMillis());

}

}

当调用 TimerTask 对象的 run() 方法时,所定义的逻辑块就会被执行。

在主函数中创建定时任务的代码如下:

import java.util.Timer;

import java.util.Date;

public class TestTimer {

public static void main(String[] args) {

Timer timer = new Timer();

SimpleTask task = new SimpleTask();

//设置定时任务

timer.schedule(task, 1000, 2000);

}

}

Timer.schedule()方法指定的第一个参数是要调度的任务,第二个参数是时间起点,第三个参数是时间间隔。

输出结果:

这是一个定时输出信息!1610104616018

这是一个定时输出信息!1610104618018

这是一个定时输出信息!1610104620019

这是一个定时输出信息!1610104622019

这是一个定时输出信息!1610104624020

这是一个定时输出信息!1610104626021

这是一个定时输出信息!1610104628022

这里我们设置了定时任务,首次执行时间是1000ms后,每2秒钟执行一次SimpleTask任务。

2.取消定时任务

如果需要在某个时间点或者条件下取消定时任务,那么需要调用 Timer.cancel() 或 TimerTask.cancel() 方法。 Timer.cancel方法表示取消计划的任务,它仅仅只是把任务从“任务列表”中删除,如果当前任务已经被计划执行但还未被执行,那么这个任务仍然会被执行。

可以在 SimpleTask 中覆盖 TimerTask类的 cancel()方法。

public class SimpleTask extends TimerTask {

private boolean canceled = false;

@Override

public void run() {

//判断定时任务是否被取消

if(canceled) return;

//实际执行的逻辑任务

System.out.println("这是一个定时输出信息!"+System.currentTimeMillis());

}

@Override

public boolean cancel() {

canceled = true;

return super.cancel();

}

}

在主函数中取消定时任务的代码如下:

public class TestTimer {

public static void main(String[] args) {

Timer timer = new Timer();

SimpleTask task = new SimpleTask();

//设置定时任务

timer.schedule(task, 1000, 2000);

//取消定时任务

try {

Thread.sleep(10000);

task.cancel();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

等待10s后,任务被取消,输出的结果如下:

这是一个定时输出信息!1610106289538

这是一个定时输出信息!1610106291538

这是一个定时输出信息!1610106293539

这是一个定时输出信息!1610106295540

这是一个定时输出信息!1610106297541

任务被取消后,不再有新的信息被输出。

三、Java定时任务的优化

在日常开发中,大量的定时任务可能会对系统性能造成显著的影响。为了避免出现这种情况,我们有以下几种常见的方式来优化定时任务。

1.使用ScheduledThreadPoolExecutor代替Timer

在 Timer 中,所有的定时任务都是由同一个线程来执行,如果当某个任务执行时间过长,那么就会造成其他任务的阻塞。因此,如果需要定时任务并发执行,可以使用 ScheduledThreadPoolExecutor 类代替 Timer,来保证定时任务的并发执行。

ScheduledThreadPoolExecutor 实现了 ExecutorService 接口和ScheduledExecutorService接口,并可以根据需要调度任务。

以下是ScheduledThreadPoolExecutor的基本用法:

public class TestScheduleExecutorService {

public static void main(String[] args) {

ScheduledExecutorService scheduleService = Executors.newScheduledThreadPool(2);

scheduleService.scheduleAtFixedRate(new SimpleTask(),3000,1000,TimeUnit.MILLISECONDS);

}

}

在创建了一个 ScheduledExecutorService 实例(在这里使用了它的工厂方法 Executors.newScheduledThreadPool() ),然后调用 scheduleAtFixedRate() 方法来安排 SimpleTask 实例的执行。

scheduleAtFixedRate() 方法有四个参数,具体如下:

scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)

参数解释:

command - 要运行的任务。

initialDelay - 首次运行任务的延迟时间。

period - 连续运行任务之间的时间间隔。

unit - initialDelay 和 period 参数的时间单位。

2.避免频繁创建Timer对象

Timer 被调用 schedule() 方法计划的任务可以从 Timer 所在线程池中的一个线程中执行。如果需要执行大量的计划任务,那么最好只创建一个 Timer,这样可以摆脱性能瓶颈,并且也可以更好地对定时任务进行调度。

下面是创建两个Timer对任务的执行时间的影响:

public class TestTimer {

public static void main(String[] args) {

Timer timer1 = new Timer();

Timer timer2 = new Timer();

SimpleTask task1 = new SimpleTask();

SimpleTask task2 = new SimpleTask();

//设置定时任务

timer1.schedule(task1, 1000, 2000);

timer2.schedule(task2, 1000, 2000);

}

}

如上面代码所示,我们创建了两个 Timer 对象,并分别设置了两个不同的 SimpleTask 任务,但是他们都按照固定的时间间隔执行,最终结果偏差巨大!

可以通过在同一个 Timer 对象中添加多个任务来避免这种情况:

public class TestTimer {

public static void main(String[] args) {

Timer timer = new Timer();

SimpleTask task1 = new SimpleTask();

SimpleTask task2 = new SimpleTask();

//设置定时任务

timer.schedule(task1, 1000, 2000);

timer.schedule(task2, 1000, 2000);

}

}

同样的两个任务,如果使用同一个 Timer 对象,则并不会出现上述时间误差巨大的问题。

四、小结

Java中通过 Timer 和 ScheduledExecutorService类实现定时任务,我们需要注意避免频繁创建 Timer 对象,并尽可能多地使用 ScheduledExecutorService类。定时任务会在 Timer 对象所在的线程池中的某个线程中执行,因此,如果某个任务的执行步骤切换太频繁,就可能会导致在整个线程池中耗时过长。通过上述优化,我们可以更好地避免定时任务带来的性能问题,提高开发效率。

  • 原标题:掌握Java定时器,提高开发效率!

  • 本文链接:https://qipaikaifa.cn/zxzx/195829.html

  • 本文由深圳中天华智网小编,整理排版发布,转载请注明出处。部分文章图片来源于网络,如有侵权,请与中天华智网联系删除。
  • 微信二维码

    ZTHZ2028

    长按复制微信号,添加好友

    微信联系

    在线咨询

    点击这里给我发消息QQ客服专员


    点击这里给我发消息电话客服专员


    在线咨询

    免费通话


    24h咨询☎️:157-1842-0347


    🔺🔺 棋牌游戏开发24H咨询电话 🔺🔺

    免费通话
    返回顶部