Java Timer使用讲解

Java Timer使用讲解

Java Timer 是 Java SE 提供的一个定时器工具,可以用于定时运行任务、周期性地运行任务等。本文将详细介绍 Timer 的使用方法和注意事项。

Timer 的基本使用方法

Timer 类提供了三个构造方法,分别为:

Timer()

Timer(boolean isDaemon)

Timer(String name)

其中,第一个构造方法创建一个非守护线程的 Timer 对象;第二个构造方法创建一个指定为守护线程的 Timer 对象;第三个构造方法接受一个字符串参数用于指定 Timer 对象的名称。

接下来的代码演示了 Timer 最基本的使用方法:

Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        System.out.println("Timer task executed.");
    }
}, 1000);

在上面的代码中,我们创建了一个 Timer 对象,并使用 schedule 方法来运行一个定时任务,该任务用于在 1000 毫秒后打印一条信息。

Timer 的周期性任务

Timer 类还提供了另外两个 schedule 方法,用于执行周期性的任务:

schedule(TimerTask task, long delay, long period)

scheduleAtFixedRate(TimerTask task, long delay, long period)

上面两个方法的参数含义基本相同,其中,task 表示需要执行的任务,delay 表示延迟多长时间后开始执行,period 表示执行任务的时间间隔。其中,schedule 方法每次执行任务的时间间隔是基于前一次任务的结束时间计算出的,而 scheduleAtFixedRate 方法则会使用相同的时间间隔来执行任务,不受上一次任务执行时间的影响。

下面的代码演示了如何使用 schedule 方法来执行一个周期性任务:

Timer timer = new Timer();
timer.schedule(new TimerTask() {
    private int count;

    @Override
    public void run() {
        System.out.printf("Timer task executed %d times.\n", ++count);
    }
}, 1000, 2000);

在上面的代码中,我们创建了一个 Timer 对象,并使用 schedule 方法来运行一个周期性的任务,该任务用于在 1000 毫秒后开始执行,每隔 2000 毫秒执行一次,并打印一条信息。

Timer 注意事项

需要注意的是,Timer 类在执行任务时只会使用一个守护线程来执行所有任务。这意味着,如果某个任务的执行时间过长,会影响到其他任务的正常执行。因此,在执行任务时应该尽量保证任务的执行时间不要过长,或将任务分割成多个较短的子任务进行执行。

此外,在 Java 5 及以上版本中,ScheduledThreadPoolExecutor 类提供了更加强大的定时任务支持,可以更加灵活地控制任务的执行时间和线程数量。因此,在编写较为复杂的定时任务时,建议使用 ScheduledThreadPoolExecutor 类代替 Timer 类。

示例

接下来,我们给出一个示例,该示例演示了如何使用 Timer 类来实现一个简单的倒计时功能。该功能用于在指定的时间内对用户进行提醒,并在倒计时结束后执行一个任务:

import java.awt.Toolkit;
import java.util.Timer;
import java.util.TimerTask;

public class CountDown {
    public static void main(String[] args) {
        long delay = 1000;
        long period = 1000;
        int seconds = Integer.parseInt(args[0]);

        final Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            private int countDown = seconds;

            @Override
            public void run() {
                Toolkit.getDefaultToolkit().beep();
                System.out.printf("Count down: %d seconds left.\n", countDown);
                if (--countDown == 0) {
                    timer.cancel();
                    System.out.println("Time's up!");
                    // execute a task after time is up
                    timer.schedule(new TimerTask() {
                        @Override
                        public void run() {
                            System.out.println("Task executed after time is up.");
                        }
                    }, 1000);
                }
            }
        }, delay, period);
    }
}

该示例程序接受一个整数参数,表示需要倒计时的时间长度(以秒为单位)。该程序会在倒计时开始后每秒钟进行一次提醒,并在倒计时结束后执行一个简单的任务。

示例

下面给出一个示例,该示例演示了如何使用 ScheduledThreadPoolExecutor 实现一个更为复杂的周期性任务。该任务用于在 1 秒之后开始执行,每隔 1 秒打印一条信息。此外,任务分别在单独的 10 个线程中执行,从而避免任务之间的互相干扰:

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

public class Scheduler {
    public static void main(String[] args) {
        int threads = 10;

        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(threads);
        scheduler.scheduleAtFixedRate(new Runnable() {
            private int count;

            @Override
            public void run() {
                System.out.printf("Task executed %d times in thread %s.\n", ++count, Thread.currentThread().getName());
            }
        }, 1, 1, TimeUnit.SECONDS);
    }
}

在上面的示例代码中,我们创建了一个 ScheduledExecutorService 对象,并将其配置为具有 10 条线程的线程池。接着,我们使用 scheduleAtFixedRate 方法来运行一个周期性的任务,该任务用于在 1 秒后开始执行,每隔 1 秒执行一次,并在独立的线程中执行。每次任务执行时,都会打印一条信息,该信息中包含当前任务的执行次数和所在的线程名称。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Timer使用讲解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • JSP经典学习笔记(包含各种入门常用语法)

    JSP经典学习笔记攻略 JSP即Java Server Pages,是一种基于 Java 技术的Web应用程序开发技术。它允许开发者在网页中嵌入 Java 代码片段,实现与动态数据交互的功能。本篇攻略将包括以下几个部分: JSP基础语法 JSP内置对象 JSP标准标签库 两条示例说明 JSP基础语法 JSP文件结构 在JSP文件中,可以使用HTML标记和Ja…

    Java 2023年6月15日
    00
  • mybatis plus自动生成器解析(及遇到的坑)

    下面我将为你详细讲解 Mybatis Plus 自动生成器解析及遇到的坑。 1. 简介 Mybatis Plus 是一款基于 Mybatis 的快速开发框架,提供了常用的 CRUD 操作、分页、逻辑删除等功能,大大减少了代码量,提升了开发效率。而其中的代码生成器,更是可以帮助我们一键生成实体、Mapper、Service、Controller 等文件,减少了…

    Java 2023年6月2日
    00
  • eclipse修改maven仓库位置的方法实现

    下面我将为您详细讲解“eclipse修改maven仓库位置的方法实现”的完整攻略。 什么是 Maven仓库 Maven是Java项目构建的一种强大工具,而Maven仓库则是Maven的核心功能之一。它是一个本地或远程的存储库,用于存储项目构建所需的依赖库和插件库。够通过Maven仓库中的Jar包来解决项目中的依赖关系,从而完成项目构建。 修改Maven仓库位…

    Java 2023年5月19日
    00
  • Java中的synchronized 优化方法之锁膨胀机制

    Java中的synchronized 优化方法之锁膨胀机制 Java中的synchronized是一种线程安全的同步机制,能够保证多个线程访问同一个对象的方法或段代码时,只有一个线程执行,其他线程等待,直到执行完毕后才能继续执行。然而,synchronized也可能带来一些性能问题。因此,Java提出了一些优化方法,其中之一就是锁膨胀机制。 什么是锁膨胀机制…

    Java 2023年5月26日
    00
  • Spring框架十一种常见异常的解决方法汇总

    下面我来详细讲解Spring框架常见异常的解决方法汇总。 1. NoSuchBeanDefinitionException异常的解决方法 NoSuchBeanDefinitionException异常表示Spring容器中没有找到对应的bean定义。出现这个异常的原因可能是配置文件名字错误、类名错误、xml文件没有配置等原因。 解决方法:- 检查配置文件名字…

    Java 2023年5月19日
    00
  • ChatGPT 对接微信公众号技术方案实现!

    作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!? 9天假期写了8天代码和10篇文章,这个5.1过的很爽?! 如假期前小傅哥的计划一样,这个假期开启了新的技术项目《ChatGPT 微服务应用体系构建》教程;从搭建环境、开发chatgpt-sdk-java、对接公众号、封装api,直至假期最后一天,完成了…

    Java 2023年5月8日
    00
  • spring boot学习笔记之操作ActiveMQ指南

    下面是对“Spring Boot学习笔记之操作ActiveMQ指南”的详细讲解。 一、前言 ActiveMQ是一个流行的消息队列中间件,它支持多种协议和语言,并且具有可扩展性、高可用性、高吞吐量等特点。本文将介绍如何在Spring Boot项目中使用ActiveMQ进行消息传递,以及使用示例说明。 二、配置ActiveMQ 首先,在Spring Boot项目…

    Java 2023年6月2日
    00
  • springboot 按月分表的实现方式

    下面是springboot按月分表的实现方式完整攻略: 第一步:创建表和初始化数据 首先,我们需要创建一张原始的订单表,结构如下: CREATE TABLE `order` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘主键ID’, `order_no` varchar(64) DEFAULT NULL…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部