getwayworker timer_Java定时器之Timer学习二

方法名称 schedule() 和 scheduleAtFixedRate() 的区别

两种情况看区别

首次计划执行的时间早于当前时间

比如说:当前时间是 11:06, 但是首次计划执行的时间应该为: 11:00

任务执行所需的时间超出任务的执行周期间隔

比如说:我们执行的任务的时间为 3秒,但是任务执行的周期间隔为 2秒。

详细分析

首次计划的时间早于当前时间

schedule 方法

fixed-delay; 如果第一次执行的时间被 delay 了,随后的执行时间按照上一次实际执行完成的时间点进行计算。

代码实例

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Timer;

import java.util.TimerTask;

public class DifferenceTest {

public static void main(String[] args) {

// 获取当前时间按照指定的格式输出

final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

Calendar calendar = Calendar.getInstance();

System.out.println("current time is:"+ sf.format(calendar.getTime()));

// 设置成6秒之前的时间

calendar.add(Calendar.SECOND, -6);

System.out.println("current time minus six second is :"+ sf.format(calendar.getTime()));

System.out.println("Task is being executed!");

// 使用 timer 来执行

Timer timer = new Timer();

timer.schedule(new TimerTask() {

@Override

public void run() {

// TODO Auto-generated method stub

System.out.println("scheduled exec time is :"+ sf.format(scheduledExecutionTime()));

}

}, calendar.getTime(), 2000);

}

}

控制台输出

current time is:2018-07-05 13:09:57

current time minus six second is :2018-07-05 13:09:51

scheduled exec time is :2018-07-05 13:09:57

scheduled exec time is :2018-07-05 13:09:59

scheduled exec time is :2018-07-05 13:10:01

scheduled exec time is :2018-07-05 13:10:03

scheduled exec time is :2018-07-05 13:10:05

scheduled exec time is :2018-07-05 13:10:07

scheduled exec time is :2018-07-05 13:10:09

schedule 方法总结

虽然我们是将事件提前了6秒,但是使用 schedule 还是从当前时间开始执行。然后每隔两秒执行一次。

scheduleAtFixedRate 方法

fixed-rate; 如果第一次执行时间被 delay了,随后的执行时间按照上一次开始的点计算,并且为了赶上进度会多次执行任务,因为 TimerTask中的执行需要考虑同步。

代码实例

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Timer;

import java.util.TimerTask;

public class DifferenceTest {

public static void main(String[] args) {

// 获取当前时间按照指定的格式输出

final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

Calendar calendar = Calendar.getInstance();

System.out.println("current time is:"+ sf.format(calendar.getTime()));

// 设置成6秒之前的时间

calendar.add(Calendar.SECOND, -6);

System.out.println("current time minus six second is :"+ sf.format(calendar.getTime()));

// 使用 timer 来执行

Timer timer = new Timer();

timer.scheduleAtFixedRate(new TimerTask() {

@Override

public void run() {

// TODO Auto-generated method stub

System.out.println("scheduled exec time is :"+ sf.format(scheduledExecutionTime()));

}

}, calendar.getTime(), 2000);

}

}

控制台输出

current time is:2018-07-06 14:32:34

current time minus six second is :2018-07-06 14:32:28

scheduled exec time is :2018-07-06 14:32:28

scheduled exec time is :2018-07-06 14:32:30

scheduled exec time is :2018-07-06 14:32:32

scheduled exec time is :2018-07-06 14:32:34

scheduled exec time is :2018-07-06 14:32:36

scheduled exec time is :2018-07-06 14:32:38

scheduleAtFixedRate 方法总结

我们可以看到实际的效果是:在启动执行的时候,会立马执行3次,就是为了追赶已经过去的6秒。然后再按照设定的间隔,每两秒钟执行一次。

任务执行所需的时间超出任务的执行周期间隔

schedule 方法

下次执行时间相当于上一次实际执行完成的时间点,因为执行的时间会不断延后。

代码实例

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Timer;

import java.util.TimerTask;

public class DifferenceTest {

public static void main(String[] args) {

// 获取当前时间按照指定的格式输出

final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

Calendar calendar = Calendar.getInstance();

System.out.println("current time is:"+ sf.format(calendar.getTime()));

// 使用 timer 来执行

Timer timer = new Timer();

timer.schedule(new TimerTask() {

@Override

public void run() {

// 模拟当前执行的过程需要 3秒

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

// 打印最近一次执行的时间

System.out.println("scheduled exec time is :"+ sf.format(scheduledExecutionTime()));

}

}, calendar.getTime(), 2000);

}

}

控制台输出

current time is:2018-07-06 14:43:51

scheduled exec time is :2018-07-06 14:43:51

scheduled exec time is :2018-07-06 14:43:54

scheduled exec time is :2018-07-06 14:43:57

scheduled exec time is :2018-07-06 14:44:00

scheduled exec time is :2018-07-06 14:44:03

说明

我们可以空控制台中输出的结果中看到:我们当前的时间为 14:43:51,然后第一次计划执行的时间也为 14:43:51。但是以后每次执行的时间都是相隔 3秒钟,并不是我们上面设置 timerTask 的时间间隔 2秒。所以说使用 schedule 方法,在这种情况下会不断的延后。

scheduleAtFixedRate 方法

下一次执行时间相对于上一次开始的时间点,因此执行时间一般不会延后,因此存在并发性

代码实例

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Timer;

import java.util.TimerTask;

public class DifferenceTest {

public static void main(String[] args) {

// 获取当前时间按照指定的格式输出

final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

Calendar calendar = Calendar.getInstance();

System.out.println("current time is:"+ sf.format(calendar.getTime()));

// 使用 timer 来执行

Timer timer = new Timer();

timer.scheduleAtFixedRate(new TimerTask() {

@Override

public void run() {

// 模拟当前执行的过程需要 3秒

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

// 打印最近一次执行的时间

System.out.println("scheduled exec time is :"+ sf.format(scheduledExecutionTime()));

}

}, calendar.getTime(), 2000);

}

}

控制台输出

current time is:2018-07-07 10:15:51

scheduled exec time is :2018-07-07 10:15:51

scheduled exec time is :2018-07-07 10:15:53

scheduled exec time is :2018-07-07 10:15:55

scheduled exec time is :2018-07-07 10:15:57

scheduled exec time is :2018-07-07 10:15:59

说明

当执行的频率为2秒钟,但是执行的时间为3秒的时。我们从控制台上的输出可以看到,执行的频率还是为2秒,因此就会存在并发性。

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

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

相关文章

前后端分离 获取客户端ip_前后端分离交互

新开一个项目,对最近学的vue进行一个总结,这段时间把前后端通信做掉.后端:介绍下使用到的工具类请求工具: postman后端框架:springboot这里顺便做了个模块化,把通用工具集放common模块中.但是这里有个问题,其实我自己研究的时候没搞懂就是之前我做模块化的时候,在本地中, 我必须…

如何安装tensorflowGPU环境搭建(不报AVX2的警告)

TensorflowGPU版本无报错的安装安装pycharm安装Anaconda5.2.0装Visual Studio下载tensorflow,更新包,然后安装下载tensorflow更新一些包,不然会报错安装tensorflow gpu版本的包CUDA的下载和安装下载CUDA9.1安装pycharm 官网版本教育版本即可…

python实现dem输出三维模型_python DEM数据可视化

我们在进行地形拟合,或者进行地形分析的时候,尝尝需要将DEM数据可视化,来于其他数据进行比较。下面是pyrhon DEM数据可视化代码if __name__ __main__:filePath u"D:/test/fang" # 输入你的dem数据dataset gdal.Open(filePath)ad…

一道简单却易混淆的高等数学求极限题目

lim⁡x→∞(11x)x2ex\lim_{x \to \infty}\frac{(1\frac{1}{x})^{x^2}}{e^x} x→∞lim​ex(1x1​)x2​ 正确的解法: 一种错误的解法: 这是同学问我的,错在了哪里? lim⁡x→∞(11x)x2是否可以等于lim⁡x→∞ex?\lim_{x \to \in…

proe50安装方法64位_proe5.0安装方法64位

内容来自用户:陈新宏PROE5.0详细安装方法PROE5.0安装方法1:先安装虚拟光驱;.2.然后e68a8462616964757a686964616f31333433646431用虚拟光驱打开PROE5.0.如下图:3.然后点----工具-----加载到虚拟光驱。4.打开我的电脑出现了一个光驱。5.然后打开这个光驱。…

8086汇编求一组正整数{0x1223,0x1234,0x1434,0x2345,0x3412,0x1712}中的最大数并存在变量MAX中

编程求一组正整数{0x1223,0x1234,0x1434,0x2345,0x3412,0x1712}中的最大数并存在变量MAX中 DATAS SEGMENT X DW 1254H,1234H,1434H,2345H,3412H,1712H MAX DW ? DATAS ENDS STACKS SEGMENT;此处输入堆栈段代码 STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS ST…

html内容封装为一个对象_技术赋能还是内容为王,哪一个才是短视频创作的关键?...

12月23日,广东高校“校园发光者工作坊”计划宣讲活动走进华南师范大学,与同学们交流短视频创作的经验与心得。南方都市报N视频内容总监陈成效向同学们介绍了视频制作的“守破离”,以新闻报道为例,讲述如何通过预判和设计&#xff…

C/C++尾插法建立单链表

思路&#xff1a; 一个s指针指向新建节点 一个节点指向尾节点 C中有引用&#xff0c;写出来很简单&#xff0c;下面给出的是天勤数据结构高分笔记上面的写法&#xff08;疯狂吐槽这种C和C混用的方法&#xff09; #include<iostream> #include<stdlib.h>using nam…

python dataframe 列赋值_dataframe根据新列特征的条件为其赋值,给

方式一&#xff1a; 直接用比较 df[B]df[[B,C]].max(axis1)方式2 &#xff1a; dataframe.apply(自定义函数)df[label]df.apply(lambda x: label_get(x.time,x.broad),axis1)### 代码测试样例dates pd.date_range(20130101, periods6)df pd.DataFrame(np.arange(24).reshap…

vue生成静态html文件_vue单文件组件,如何生成.html文件

vue-cli项目怎么生成.html文件&#xff1f;项目使用了element-ui还有自定义的less文件vue组件&#xff1a;这是一段文字...生成......handlerBulder () {const html this.$refs.fields.outerHTMLvar a document.createElement(a);var url window.URL.createObjectURL(new Bl…

C++头插法尾插法建立单链表,合并两个有序单链表

A和B是两个单链表&#xff08;带表头结点&#xff09;&#xff0c;其中元素递增有序。设计一个算法&#xff0c;将A和B归 并成一个按元素值非递减有序的链表 C&#xff0c;C由A 和B 中的结点组成。 #include<iostream> #include<stdlib.h>using namespace std;typ…

Java毕业设计—springboot健身房管理系统

一、项目背景介绍&#xff1a; 随着人们生活水平的提高和健康意识的增强&#xff0c;健身行业逐渐兴起并迅速发展。而现代化的健身房管理系统已经成为健身房发展的必备工具之一。传统的健身房管理方式已经无法满足现代化健身房的需求&#xff0c;需要一种更加高效、智能、安全…

C/C++二叉树前序遍历,中序遍历,后序遍历

二叉树的先序遍历&#xff0c;中序遍历&#xff0c;后序遍历 #include <iostream>using namespace std;typedef struct BTNode {char data;struct BTNode* lchild;struct BTNode* rchild; }BTNode;void preorder(BTNode* p) {if(p!NULL){cout<<p->data;preord…

学校校车运营各项安全管理制度_学校校车接送安全管理制度(通用3篇)

学校校车接送安全管理制度(通用3篇)在不断进步的时代&#xff0c;各种制度频频出现&#xff0c;制度是维护公平、公正的有效手段&#xff0c;是我们做事的底线要求。你所接触过的制度都是什么样子的呢&#xff1f;以下是小编为大家整理的学校校车接送安全管理制度(通用3篇)&…

osm数据下载 python_GIS Experience (十):OSM数据获取

参考资料 1 OSM OpenStreetMap 获取城市路网数据及转为ESRI shp数据的方法 2 OSM获取路网数据 &#xff08;数据转换方法对比&#xff09;1 前言OpenStreetMap&#xff08;OSM&#xff09;意在创造一个内容自由且能让所有人编辑的世界地图&#xff0c;详见官网。2 数据获取2.1 …

两个字符串的最长公共子序列长度_程序员编程算法,解决文本相似度问题的最长公共子序列算法!...

在前面我讲解了如何通过最长公共子串来求解两个文本的相似度问题&#xff0c;但它有一定缺陷&#xff0c;举个例子&#xff0c;看下面的两个字符串我爱吃小青菜和各种鲜水果。我很爱吃青菜与各样水果。上面两个字符串&#xff0c;如果通过计算子串来求相似度&#xff0c;会发现…

VOC2007xml转YOLO的txt格式代码

使用方法&#xff08;二选一即可&#xff09;&#xff1a; python 这个文件名.py --xml_dir xml文件路径 --image_dir 图片所在路径 --out_dir 输出文件夹放在和VOC2007同级路径下运行即可 import os import xml.etree.ElementTree as ET import cv2 import argparse from tqd…

ctf up怎么写 write_??零基础写网络爬虫的思路??

网络爬虫&#xff0c;用一句话简单总结&#xff0c;就是一种按照一定的规则&#xff0c;自动的抓取万维网信息的程序或者脚本。写这篇文章的初衷是有个知友私信我说&#xff0c;模仿了很多网上用Python写爬虫的例子&#xff0c;但到了需要自己动手写爬虫的时候又不知道怎么写了…

VMwarestation环境下的centos7(Minimal)静态ip配置(桥接模式)

笔者本来是为了用三台centos7&#xff08;最小化安装版本&#xff09;的虚拟机搭建一个Zookeeper的环境&#xff0c;但是在搭建的过程中遇到了一些问题&#xff0c;遂记录之。 为了便捷&#xff0c;除了希望三台配置了静态ip的虚拟机可以和宿主机之间互相ping通之外&#xff0…