0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

java实现定时器的四种方式

工程师邓生 来源:未知 作者:刘芹 2023-10-18 17:20 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

java实现定时器的四种方式

1. 使用Thread.sleep()方法

Thread.sleep()方法可以让当前线程暂停执行一段时间,我们可以利用它来实现简单的定时器。

示例代码:

```java
public class TimerDemo1 {
public static void main(String[] args) throws InterruptedException {
int count = 0;
while (true) {
System.out.println("定时器已经运行了 " + (++count) + " 秒");
Thread.sleep(1000); // 暂停1000毫秒,即1秒
}
}
}
```

该示例中我们使用了一个无限循环,每次循环输出当前运行的时间,并暂停1秒钟后再继续。

优点:实现简单,易于理解。

缺点:无法在定时器运行过程中修改定时器的时间或停止定时器,不适合实现复杂的定时器逻辑。

2. 使用Timer类

Timer类是Java提供的一个简单的定时器工具,可以轻松实现定时器的开启、停止、暂停等操作。

示例代码:

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

public class TimerDemo2 {
public static void main(String[] args) throws InterruptedException {
Timer timer = new Timer();
int count = 0;
timer.schedule(new TimerTask() {
public void run() {
System.out.println("定时器已经运行了 " + (++count) + " 秒");
}
}, 1000, 1000);
Thread.sleep(5000);
timer.cancel();
}
}
```

该示例中我们使用了Timer类实现定时器的功能,使用timer.schedule()方法开启定时器,可以设定初始延迟时间、定时器间隔时间,并通过timer.cancel()方法停止定时器。

优点:使用方便,适合实现一些简单的定时任务。

缺点:无法在定时器运行过程中修改定时器的时间或停止定时器,不支持并发操作。

3. 使用ScheduledExecutorService类

ScheduledExecutorService类是Java提供的用于定时执行任务的工具类,可以设定定时器的初始延迟时间、间隔时间、并发量等参数,支持更加灵活的定时器条件设定和停止。

示例代码:

```java
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class TimerDemo3 {
public static void main(String[] args) throws InterruptedException {
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); // 开启一个线程池
int count = 0;
executor.scheduleAtFixedRate(() -> System.out.println("定时器已经运行了 " + (++count) + " 秒"), 1, 1, TimeUnit.SECONDS);
Thread.sleep(5000);
executor.shutdownNow();
}
}
```

该示例中我们使用了ScheduledExecutorService类实现定时器的功能,在executor.scheduleAtFixedRate()方法中设定了初始延迟时间、定时器间隔时间,并通过executor.shutdownNow()方法停止定时器。

优点:灵活且方便,支持并发操作,适合实现一些复杂的定时任务。

缺点:算法略有复杂,需要一定的背景知识。

4. 使用Quartz类

Quartz是Java中一个强大的定时器框架,支持各种复杂的计划和时间设定,适用于大型项目中的复杂定时任务。

示例代码:

```java
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;

import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.CronScheduleBuilder.cronSchedule;

public class TimerDemo4 {
public static void main(String[] args) throws SchedulerException, InterruptedException {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 获取调度器
scheduler.start();
Job myJob = new Job() { // 自定义任务
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("调度器运行中...");
}
};
scheduler.scheduleJob(
newJob(myJob.getClass()) // 设置任务
.withIdentity("myJob", "group1")
.build(),
newTrigger()
.withIdentity("myJobTrigger", "group1")
.withSchedule(
simpleSchedule() // 不重复执行
.withIntervalInSeconds(1)
.withRepeatCount(0)
)
.build()
);
Thread.sleep(5000);
scheduler.shutdown();
}
}
```

该示例中我们使用了Quartz框架实现定时器,创建一个自定义的任务,并调度它的执行。我们可以通过修改Trigger实现更加复杂的时间调度设定。

优点:可以实现各种复杂的计划和时间设定,适用于大型项目中的复杂定时任务。

缺点:相对于其他方案来说,Quartz的学习和上手成本比较高。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    2997

    浏览量

    115683
  • 定时器
    +关注

    关注

    23

    文章

    3361

    浏览量

    121749
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CW32A030微控制定时器

    CW32A030 微控制内部集成多达个通用定时器、三个基本定时器和一个高级控制定时器。 1 高级
    发表于 12-04 06:47

    CW32L010+定时器介绍

    这一篇介绍一下定时器的内容,从了解CW定时器到功能实现。 一、定时器类型 CW32L010系列MCU配备了多种类型的定时器,包括: 通用和基
    发表于 12-01 07:53

    CW32L0开发板学习记录,高级定时器ATIM学习

    通道,可以测量输入信号的脉冲宽度(输入捕获)或者产生输出波形(输出比较和 PWM)。 低功耗定时器(LPTIM): 内部集成1个 16 位低功耗定时器(LPTIM),可以以很低的功耗实现定时
    发表于 12-01 07:35

    CW32定时器及中断介绍

    以CW32L083为例,其定时器分为6: 基本定时器:CW32L083 内部集成 3 个基本定时器 (BTIM),每个 BTIM 完全独立且功能完全相同,各包含一个 16bit 自
    发表于 12-01 07:08

    单片机定时器中断

    定时器/计数的工作方式寄存,确定工作方式和功能;TCON是控制寄存,控制T0,T1的启动
    发表于 11-24 06:22

    PWM、定时器、SysTick 区别及应用场景

    。下面我们来梳理清楚。一、基本概念定时器(Timer)MCU内最基础的计数外设,通过计数时钟周期实现定时、计数功能。多数MCU内部有多个通用定时器,可配置为
    的头像 发表于 11-17 10:53 227次阅读
    PWM、<b class='flag-5'>定时器</b>、SysTick 区别及应用场景

    ‌TLC551 LinCMOS™ 定时器芯片技术文档总结

    TLC551 是使用 TI LinCMOS 制造的单片定时电路^TM的^过程。这定时器与 CMOS、TTL 和 MOS 逻辑完全兼容,工作频率高达 2 MHz。与 NE555 定时器相比,该器件由于输入阻抗高,因此使用更小的
    的头像 发表于 09-24 09:16 642次阅读
    ‌TLC551 LinCMOS™ <b class='flag-5'>定时器</b>芯片技术文档总结

    SysTick系统滴答定时器简介

    SysTick—系统定时器是属于CM33内核中的一个外设,内嵌在NVIC中。系统定时器是一个24bit的向下递减的计数,计数每计数一次的时间为 1/SYSCLK,一般我们设置系统时
    的头像 发表于 09-23 09:50 1335次阅读
    SysTick系统滴答<b class='flag-5'>定时器</b>简介

    大彩讲堂:VisualHMI-LUA教程-定时器的使用指南

    定时器的使用
    的头像 发表于 08-31 16:59 850次阅读
    大彩讲堂:VisualHMI-LUA教程-<b class='flag-5'>定时器</b>的使用指南

    RDMA简介3之四种子协议对比

    RDMA协议共有四种子协议,分别为InfiniBand、iWARP、RoCE v1和RoCE v2协议。这四种协议使用统一的RDMA API,但在具体的网络层级实现上有所不同,如图1所示,接下来将
    发表于 06-04 16:05

    MCU定时器/计数

    RISC-V核低功耗MCU通过灵活的定时器架构、低功耗模式适配及硬件级中断优化,在工业控制、智能家居等场景中实现高精度计时与能耗控制的协同设计,满足复杂任务调度与实时响应的双重需求‌。 一、‌硬件
    的头像 发表于 04-27 13:54 592次阅读

    变频主要支持哪四种模式?有什么区别?

    变频作为现代工业自动化领域中的关键设备,其控制模式的多样性和灵活性对于满足不同应用场景的需求至关重要。变频主要支持四种控制模式:无PG的V/F模式、有PG的V/F模式、无PG的矢量控制模式以及有
    的头像 发表于 04-16 18:22 1766次阅读
    变频<b class='flag-5'>器</b>主要支持哪<b class='flag-5'>四种</b>模式?有什么区别?

    芯片封装中的四种键合方式:技术演进与产业应用

    自动键合和混合键合四种主流技术,它们在工艺流程、技术特点和应用场景上各具优势。本文将深入剖析这四种键合方式的技术原理、发展现状及未来趋势,为产业界提供技术参考。
    的头像 发表于 04-11 14:02 2390次阅读
    芯片封装中的<b class='flag-5'>四种</b>键合<b class='flag-5'>方式</b>:技术演进与产业应用

    私藏技术大公开!四种常见供电方案

    在现代生活中,供电问题直接关系到我们的生活质量与工作效率。以下是四种超实用的供电方案,无论是在家庭生活还是工作场景中,都能为你提供稳定可靠的电力支持。 常见的物联网应用场景下,供电方式四种
    的头像 发表于 12-31 14:28 2779次阅读
    私藏技术大公开!<b class='flag-5'>四种</b>常见供电方案

    被问爆的四种供电方式,来啦~

    4G模组的外部电源供电设计十分重要,对系统稳定、射频性能都有直接影响。 常见的物联网应用场景下,供电方式四种: LDO供电方式 DCDC供电方式 锂电池供电以及充电
    的头像 发表于 12-30 15:40 1499次阅读
    被问爆的<b class='flag-5'>四种</b>供电<b class='flag-5'>方式</b>,来啦~