java实现定时器的方法

news2024/11/25 20:47:44

 

大家在工作中,常常会遇到一些突发的工作,需要在短时间内完成。这就要求我们能够快速的处理这些突发事件,但是如果直接调用方法来做,时间太长了,会导致程序变得臃肿。那么有没有什么好的办法呢?下面我们就来看下 java中是如何实现定时器的。 在 Java中有很多方法可以实现定时器,其中比较常见的就是 counter和 notify,它们都可以用来设置时间,并且实现了一种功能叫做 arr。 其中 arr ()方法在很多地方都可以用到,在这里面我们主要讲的是 setTimeout方法。setTimeout是一个定时器,当时间达到时,就会抛出一个异常。这个方法在平时的工作中使用非常多。

  • 一、功能介绍

    上面的代码中,我们可以看到在 setTimeout方法中,会给出一个时间的值,并且这个时间是由线程来执行的,所以我们可以根据这个时间值来设置线程的执行顺序。 1. setTimeout ()方法的参数是一个内置的常量,表示一个变量,也就是一个方法。该方法会在当前线程执行完毕时自动释放。在这个方法中,首先会先创建一个 static对象,然后用来存储这个常量。由于我们设置了一个时间,所以这个常量会被阻塞。 2. setTimeout ()方法可以设置在指定时间之后,线程才会开始执行。由于是在指定时间之后才开始执行,所以不会出现超时的情况。 3.当线程执行完毕后,会对当前线程的状态进行更新,并且为我们创建一个新的常量对象。在这个对象中,有一个 dump方法,里面会把所有线程中保存的常量进行汇总。 4.当调用 setTimeout ()方法时,不需要重新初始化这个常量。 5.在运行过程中,如果出现异常,将会抛出一个异常。 6.最后提醒大家一下: setTimeout方法有很多种用法,在这里我们选择了最常见的一种使用方法: 当 setTimeout方法执行完后,就会调用 new System ()函数来创建一个新的对象。当新对象创建完毕后就会进行初始化,在这个过程中调用 setTimeout ()方法会抛出一个异常。当抛出异常后就可以停止这个线程的运行。

  • 二、实现原理

    下面我们来看看 setTimeout方法的实现原理。 setTimeout方法的第一个参数是定时器数组,这个数组是在 java. util. TimeData包中定义的。这里面包括了一个 timestamp数组,以及一个 time参数,这里需要注意的是 time参数,在 setTimeout方法中是一个不带参数的 time参数,这个 time参数是用来设置定时器数组所需的时间,而不是用来设置定时器的时间。然后就是一个数组,这里就不解释了。 第二个参数是返回值,当定时器设置好之后,返回值就是一个 timestamp数组。当达到时间点时,会抛出一个异常来停止定时器工作。 如果要实现多线程的定时器,可以在 setTimeout方法中加入多个线程。这样可以多个线程一起工作,并不会出现任务积压的情况。然后在多线程的状态下, setTimeout方法可以设置定时器退出的时间,如果在设定的时间内没有执行完任务的话,就会抛出异常。 如果我们有多个任务要完成,但是每一个任务都要执行很久才能完成的话,就可以使用多线程来配合完成。首先我们要先定义一个线程,在这个线程里面可以放两个定时器。 第一个定时器叫做 timestamp数组,这个数组包含了一个 time参数。接着我们把第一个定时器设置好之后就可以使用第二个定时器了。这个第二个定时器和第一个定时器是一样的,只是在 timestamp数组中添加了一个 timestamp数组元素。接下来就是执行的问题了。 第一个线程设置好 timestamp之后,把第二个定时器设为 timestamp数组的最后一个元素,然后启动第二个定时器执行任务就行了。如果第一个定时器没有执行完任务的话,那么就会抛出异常来终止定时器工作了。

  • 三、示例代码

    示例代码的源码中,有两个变量,一个是 counter,一个是 setTimeout。首先,我们先创建一个空的变量。我们需要设置一个时间为60秒。这个变量就是 counter变量,可以设置成具体的时间点。 下面我们来创建一个 setTimeout变量,这个变量需要在第一次调用 setTimeout方法时创建。 首先我们对上面的代码进行封装,使其在第一次调用 setTimeout方法时,就创建了一个新的变量。下面是封装后的代码: 我们发现如果用 counter方法来设置时间的话,会抛出异常,因此我们在上面设置了一个 notify方法来设置时间。 上面是创建新变量 setTimeout的代码,下面是对这个变量进行初始化的代码: 在这里我们需要注意两点: 第一点是 setTimeout方法一定要在第一次调用时创建。如果不创建这个变量的话,程序在运行过程中,这个变量就会抛出异常。 第二点是 notify方法不能重复调用。因为当调用了 notify方法后,程序就会终止运行。如果要再次调用该方法的话,程序就会抛出一个异常。 下面我们来看下 notify的效果: 上面这段代码是不是很简单呢?通过上面的操作,我们可以把所有的时间都设置好了。在这个例子中,如果时间已经到了60秒,那么就会抛出异常。这样就可以很快的处理突发事件了。 以上就是 java中实现定时器的方法了,希望对大家有所帮助!最后给大家分享一个免费的学习资料:《Java核心技术要点》(最新版)资料领取入口!

  • 四、总结

    最后我们再来回顾下之前讲过的内容: java中的时间是以毫秒为单位的,我们在设置好一个时间以后,程序会自动把这个时间转换为一毫秒。另外,当我们需要修改某个变量的值时,也是要用到这个方法的,比如设置一个变量的初始值为1,而现在修改了变量的值,那么这个变量会被转换为0.1或者0.01。 在定时器中,有一个重要的参数叫做 top ()方法,当我们调用它的时候会产生一个异常。当我们给这个方法设置时间时,如果时间达到了就会抛出一个异常。 最后我们总结一下: 1、 counter和 notify都是可以实现定时器的。notify是使用 arr ()方法来设置时间,而 counter使用 setTimeout方法来设置时间。 2、 setTimeout方法在程序运行中会抛出一个异常,这个异常可以通过调用 notify方法来释放内存。

常用的java定时器代码如下:

1. 使用Timer类实现定时器
```java
import java.util.Timer;
import java.util.TimerTask;
public class MyTimer {
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("定时器任务执行了");
}
}, 1000, 2000);
}
}
```
上述代码中,使用Timer类创建定时器,schedule方法可以设置定时器任务的执行时间和间隔时间。
2. 使用ScheduledExecutorService类实现定时器
```java
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class MyTimer {
public static void main(String[] args) {
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("定时器任务执行了");
}
}, 1000, 2000, TimeUnit.MILLISECONDS);
}
}
```
上述代码中,使用ScheduledExecutorService类创建定时器,scheduleAtFixedRate方法可以设置定时器任务的执行时间和间隔时间。
3. 使用Spring的@Scheduled注解实现定时器
```java
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class MyTimer {
@Scheduled(initialDelay = 1000, fixedDelay = 2000)
public void timerTask() {
System.out.println("定时器任务执行了");
}
}
```
上述代码中,使用Spring的@Scheduled注解创建定时器,initialDelay属性可以设置定时器任务的初始延迟时间,fixedDelay属性可以设置定时器任务的间隔时间。需要在Spring配置文件中开启定时器功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/424158.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

notepad++在windows下使用mingw编译C语言

mingw下载链接:https://winlibs.com/ 官网https://www.mingw-w64.org也能下载,不过官网下载的那个不会用,以后再试了。 strawberry里面也集成了gcc编译器,使用它也可以编译,只是试了一下。 解压后有1个多G&#xf…

python入门(五) vscode配置Anaconda 环境,代码自动提示

文章目录1.conda的下载地址:1.配置conda的环境变量安装conda配置path2.vcode配置python插件3.配置conda1) Select Interpreter2) 选择conda环境4.测试vscode配置Anaconda 环境,代码自动提示. 本人工作中,用到了ai相关技术,但是java出身&#…

400元左右的蓝牙耳机哪个牌子好?400以内的蓝牙耳机推荐

目前市面上的真无线耳机是百花齐放,小巧的无线蓝牙耳机携带方便,已经成为很多人生活的标配产品,通勤、办公、音乐、游戏方方面面都离不开TWS耳机。近两年,TWS耳机飞速发展,各方面的功能和体验均已完善,因此…

06_GBDT+LR论文翻译

0.摘要 在线广告允许广告客户仅针对可衡量的用户响应进行出价和付费,例如广告点击。因此,点击预测系统是大多数在线广告系统的核心。伴随每日活跃用户超过7.5亿,活跃广告客户超过100万的情况,预测Facebook广告点击是一项具有挑战…

AI加持,让图片处理更加得心应手

AI图片处理工具不仅能够帮助我们更高效地完成图片编辑和设计任务,还能够通过机器学习和深度学习技术生成出独特的图片和视觉效果。本期日报为大家带来了几款非常不错的AI图片工具,它们能够让你在创作中更具创意和想象力。不要再犹豫了,赶紧来…

Yolo V7详解及openvino部署

论文: https://arxiv.org/abs/2207.02696 代码: https://github.com/WongKinYiu/yolov7 Anchor Anchor是一种用于目标检测的先验框(prior box)生成方法,由Ren等人在2015年提出。Anchor可以在不同尺度和不同纵横比下生成多个先验框,并通过与真实目标框的…

工程项目管理系统源码-全面的工程项目管理

​ ​工程项目管理系统是指从事工程项目管理的企业(以下简称工程项目管理企业)受业主委托,按照合同约定,代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 如今建筑行业竞争激烈,内卷严重&#xff0c…

第17章_反射机制

第17章_反射机制 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 本章专题与脉络 1. 反射(Reflection)的概念 1.1 反射的出现背景 Java程序中,所有的对象都有两种类型:编…

shell命令总结

目录ls - 查看目录cd - 切换目录whereis - 查看是否有指定目录touch - 创建空文件mkdir - 创建目录cp - 复制文件或目录mv - 移动文件、更名rm - 删除文件cat - 显示文件内容more - 分页显示文件内容head - 查看文件前N行tail - 查看文件的后几行ln - 产生链接文件chomd - 改变…

图片转pdf无水印版怎么转换?快收藏这三种免费转换方法!

图片转pdf无水印版怎么转换?在日常生活中,为了节省批量图片发送的时间,我们通常会将多张图片转换成PDF文件格式文档,然后发送给他人。 目前在市场上有很多软件可以将图片转PDF。你想知道哪个软件可以将图片转PDF没有水印吗&#…

【生活工作经验 十】ChatGPT模型对话初探

最近探索了下全球大火的ChatGPT,想对此做个初步了解 一篇博客 当今社会,自然语言处理技术得到了迅速的发展,人工智能技术也越来越受到关注。其中,基于深度学习的大型语言模型,如GPT(Generative Pre-train…

Spring创建和使用

日升时奋斗,日落时自省 目录 1、创建Spring项目 1.1、创建Maven项目 1.2、添加Spring框架支持 1.3、添加启动类 2、存储Bean对象 2.1、创建Bean 2.2、将Bean注册到容器 3、获取并使用Bean对象 3.1、创建Spring上下文 3.2、获取指定的Bean对象 3.2.1、Id…

2023 年 MQTT 协议的 7 个技术趋势|描绘物联网的未来

MQTT 是物联网消息传输标准协议,其采用极其轻量级的发布订阅消息模型,以可扩展、可靠且高效的方式连接物联网设备。 自 1999 年 IBM 发布 MQTT 以来已经过去了二十多年,而自 2012 年 EMQ 在 GitHub 上发布开源 MQTT 消息服务器 EMQX&#xf…

FVM链的Themis Pro,5日ido超百万美元

交易一直是 DeFi 乃至web3领域最经久不衰的话题,也因此催生了众多优秀的去中心化协议,如 Uniswap 和 Curve。这些协议逐渐成为了整个系统的基石。 在永续合约方面,DYDX 的出现将 WEB2 时代的订单簿带回了web3。其链下交易的设计,仿…

USRP简介

USRP定义 USRP为Universal Software Radio Peripheral缩写,即通用软件无线电外设,是由Ettus Research及其母公司National Instruments设计和销售的一系列软件定义无线电。 大多数USRP通过高速链路连接到主机,基于主机的软件用它来控制USRP硬…

一文吃透Http协议

Http 协议 1. 初始 Http Http 协议 , 是应用层最为广泛使用的协议 , Http 就是浏览器和服务器之间的桥梁. Http 是基于 TCP 协议实现的 , 通常我们输入搜索框中的网址 (URL) , 浏览器就会根据这个 URL 构造出一个 Http 请求 , 发送给服务器. 服务器就会返回一个 Http 响应(包…

立体图

[NOIP2008 普及组] 立体图 题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。 小渊有一块面积为 mnm \times nmn 的矩形区域,上面有 mnm \…

网络攻击与防御

1.什么是数据认证,有什么作用,有哪些实现的技术手段? 数字认证证书它是以数字证书为核心的加密技术可以对网络上传输的信息进行加密和解密、数字签名和签名验证,确保网上传递信息的安全性、完整性。 使用了数字证书,即使您发送的…

【Python爬虫项目实战一】获取Chatgpt3.5免费接口文末付代码(过Authorization认证)

目录 🚩前言🍑工具🍉分析流程🧅实战部分🧅🧅模拟登陆🧅🧅模拟提问请求🥒login方法🥒chatgpt方法🌰总结🚩前言 大家好!今天的目标是拿下Openmao的接口,他的接口内容和chatgpt3.5是一样的,它们的免责申明中写道:本站点基于外部API二次开发,仅供学习…

【数据结构学习2】线性表、顺序表、C/C++补充

目录线性表线性表的定义和特点线性表类型定义线性表的存储结构顺序存储结构顺序表基本操作的实现顺序表的查找算法分析:平均查找长度ASL(Average Search Length)顺序表的插入顺序表的删除补充 C/CC中的参数传递引用类型做形参的三点说明线性表 线性表的定义和特点 …