java se 定时任务_Java实现定时任务的三种方法
一、Quartz的特点 按作业类的继承方式来分,主要有以下两种: 作业类继承org.springframework.scheduling.quartz.QuartzJobBean类的方式作业类不继承org.springframework.scheduling.quartz.QuartzJobBean类的方式 注:个人比较推崇第二种,因为这种方式下的
在应用里经常都有用到在后台跑定时任务的需求。举个例子,比如需要在服务后台跑一个定时任务来进行非实时计算,清除临时数据、文件等。在本文里,我会给大家介绍3种不同的实现方法: 普通thread实现 TimerTask实现 ScheduledExecutorService实现 普通thread 这是最常见的,创建一个thread,然后让它在while循环里一直运行着,通过sleep方法来达到定时任务的效果。这样可以快速简单的实现,代码如下: package com.vmware.task;import java.util.Date;import java.util.List;import java.util.Map;import com.vmware.dao.TemplateDao;import com.vmware.pojo.Template;import com.vmware.util.TimeUtil;public class TemplateVMTask implements Runnable
{
@Override
public void run() {
while(true){
long starttime=new Date().getTime();//开始时间
String sql="SELECT * from tb_flw_content where type_id='1' or type_id='4'
and `status`='2'";
TemplateDao dao=new TemplateDao();
List list=dao.getTemplate(sql);
VirtualMachineTemplate template=new VirtualMachineTemplate();
template.tempalteToVm(list);
long endtime=new Date().getTime();//结束时间
long usetime=endtime-starttime;//使用时间
try{
//读取配置文件
TimeUtil util=new TimeUtil();
Map map=util.getURL();
long time=Long.parseLong(String.valueOf(map.get("time")))*1000;//配置时间
if(time-usetime>0){
Thread.sleep(time-usetime);//休眠时间
}
}catch(Exception e){
e.printStackTrace();
}
}
}}在main 方法中,启动该线程 package com.vmware.test;import com.vmware.task.TemplateVMTask;public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TemplateVMTask task=new TemplateVMTask();
Thread thread=new Thread(task);
thread.start();
}} 用Timer和TimerTask 上面的实现是非常快用三种方法来实现n!实现使用BigDecimal类,因为用int最多正确算到12!,用long最多正确算到20!.实现方法都比较简单,但是转换为BigDecimal实现后可能看起来有点莫名其妙。废话不多说,直接上代码:
第一种方法:从1开始,一直递增乘到n,从而实现n!
Java代码速简便的,但它也缺少一些功能。 用Timer和TimerTask的话与上述方法相比有如下好处: 当启动和去取消任务时可以控制 第一次执行任务时可以指定你想要的delay时间 在实现时,Timer类可以调度任务,TimerTask则是通过在run()方法里实现具体任务。 Timer实例可以调度多任务,它是线程安全的。 当Timer的构造器被调用时,它创建了一个线程,这个线程可以用来调度任务: import java.util.Timer;import java.util.TimerTask;public class Task2 {
public static void main(String[] args) {
TimerTask task = new TimerTask() {
@Override
public void run() {
// task to run goes here
System.out.println("Hello !!!");
}
};
Timer timer = new Timer();
long delay = 0;
long intevalPeriod = 1 * 1000;
// schedules the task to be run in an interval
timer.scheduleAtFixedRate(task, delay,
intevalPeriod);
} // end of main} ScheduledExecutorService ScheduledExecutorService是从Java SE 5的java.util.concurrent里,做为并发工具类被引进的,这是最理想的定时任务实现方式。 相比于上两个方法,它有以下好处:
相比于Timer的单线程,它是通过线程池的方式来执行任务的
可以很灵活的去设定第一次执行任务delay时间
提供了良好的约定,以便设定执行的时间间隔
我们通过ScheduledExecutorService#scheduleAtFixedRate展示这个例子,通过代码里参数的控制,首次执行加了delay时间: import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class Task3 {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
public void run() {
// task to run goes here
System.out.println("Hello !!");
}
};
ScheduledExecutorService service = Executors
.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.SECONDS);
}}
java se 定时任务_Java实现定时任务的三种方法相关推荐
- java string分割_java 字符串分割的三种方法(总结)
最近在项目中遇到一个小问题,一个字符串分割成一个数组,类似String str="aaa,bbb,ccc"; 然后以","为分割符,将其分割成一个数组,用什么方 ...
- java浮点数化为整数_[Java教程]javascript浮点数转换成整数三种方法
[Java教程]javascript浮点数转换成整数三种方法 0 2014-06-24 04:00:27 将浮点数转换成整数方法有很多,分享三种常用方法. Summary 暂时我就想到3个方法而已.如 ...
- Java程序初始化启动自动执行的三种方法
目录 @PostConstruct注解 CommandLineRunner接口 ApplicationRunner 接口 @Order注解设置启动顺序 分享一下自己用过的java程序初始化启动自动执行 ...
- java定义数组_java中数组的三种定义方式_java中数组的定义及使用方法(推荐)...
java中数组的三种定义方式 java中,数组是一种很常用的工具,今天我们来说说数组怎么定义 [java] view plain copy /** * 数组的三种定义方法 * 1.数组类型[] 数组名 ...
- java的字符串截取函数_java 字符串截取的三种方法(推荐)|chu
众所周知,java提供了很多字符串截取的方式.下面就来看看大致有几种. 1.split()+正则表达式来进行截取. 将正则传入split().返回的是一个字符串数组类型.不过通过这种方式截取会有很大的 ...
- java字符串abc反转_JAVA字符串反转的三种方法
方法一:使用StringBuilder import java.util.Scanner; public class StrReversal { public static void main(Str ...
- java截取倒数后六位的字符串_java 字符串截取的三种方法(推荐)
众所周知,java提供了很多字符串截取的方式.下面就来看看大致有几种. 1.split()+正则表达式来进行截取. 将正则传入split().返回的是一个字符串数组类型.不过通过这种方式截取会有很大的 ...
- java定时执行某个方法_Java中定时执行任务的三种方法
Java中定时执行任务的三种方法 1)java.util.Timer 这个方法应该是最常用的,不过这个方法需要手工启动你的任务: Timer timer=new Timer(); timer.sche ...
- java连接MySQL几种方法_Java连接MySQL数据库三种方法
好久没有更新博客了!今天利用周目时学习了一下数据库mysql.介绍一下数据库的三种连接方式! 开发工具:Myeclipse MySQL5.6 MySQL连接驱动:mysql-connector-jav ...
- Java实现监听文件变化的三种方法,推荐第三种
背景 在研究规则引擎时,如果规则以文件的形式存储,那么就需要监听指定的目录或文件来感知规则是否变化,进而进行加载.当然,在其他业务场景下,比如想实现配置文件的动态加载.日志文件的监听.FTP文件变动监 ...
最新文章
- [译]Selenium Python文档:一、安装
- P1759 通天之潜水(不详细,勿看)(动态规划递推,组合背包,洛谷)
- PerfLab(直接在服务器上完成)
- gstreamer应用
- 浏览器的一个请求从发送到返回都经历了什么?
- Fisher–Yates shuffle 算法
- 时隔2月,我的第二篇
- c语言计算结果为1. inf0000,C语言复习题及答案老师给的
- 有道词典 Chrome取词插件
- robot framework接口自动化测试post请求
- python 字符编码识别及转换
- Android科大讯飞语音合成
- Spring Cloud Netflix 服务注册与发现 — Eureka 入门案例
- 基线、底线、顶线、中线
- 20X01 FCPX插件 音频可视化视觉特效 PFS Fcpx Audio Effector
- Vue中使用pdfJs预览PDF、图片
- uni-app 微信小程序 + 友盟统计 sdk
- android hal单元测试,用于HAL测试的参数化gtest
- 命令行模式下运行js文件
- S32K144学习笔记:4 信号复用和引脚分配