Java实现定时任务的3种方式
2015-10-25 23:25
621 查看
一、普通的Thread
这是最常见的,创建一个thread,然后让它在while循环里一直运行着,通过sleep方法来达到定时任务的效果。这样可以快速简单的实现,代码如下:package com.ghs.task; public class Task1 { public static void main(String[] args) { final long timeInterval = 1000; //时间间隔,这里是1s Runnable runnable = new Runnable() { @Override public void run() { while(true){ System.out.println("正在执行定时任务!"); //……定时任务代码 try { Thread.sleep(timeInterval); } catch (InterruptedException e) { e.printStackTrace(); } } } }; Thread thread = new Thread(runnable); thread.start(); } }
这种方式的缺陷在于无法手动取消和启动定时任务。
二、使用Timer、TimerTask
上面的实现是非常快速简便的,但它也缺少一些功能。1、用Timer和TimerTask的话与上述方法相比有如下好处
启动和取消任务时可以控制
第一次执行任务时可以指定你想要的delay时间
2、实现原理
在实现时,Timer类负责调度任务,TimerTask则是通过在run()方法里执行具体任务。
当Timer的构造器被调用时,它创建了一个线程,这个线程可以用来调度任务。可以简单的理解为在这个线程的run()方法里面不停的调用TimerTask的run()方法,即不停地执行任务。
Timer实例可以调度多任务,它是线程安全的。
package com.ghs.task; 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() { System.out.println("正在执行定时任务"); //……定时任务代码 } }; Timer timer = new Timer(); long delay = 3000; //推迟多久后开始执行定时任务,这里推迟3s long period = 1000; //时间间隔,这里设置为1s timer.scheduleAtFixedRate(task, delay, period); } }
三、使用ScheduledExecutorService
ScheduledExecutorService是从Java SE 5的java.util.concurrent里,做为并发工具类被引进的,这是最理想的定时任务实现方式。相比于上两个方法,它有以下好处:
相比于Timer的单线程,它是通过线程池的方式来执行任务的
可以很灵活的去设定第一次执行任务delay时间
提供了良好的约定,以便设定执行的时间间隔
下面是实现代码,我们通过ScheduledExecutorService.scheduleAtFixedRate展示这个例子,通过代码里参数的控制,首次执行加了delay时间。
package com.ghs.task; 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() { @Override public void run() { System.out.println("正在执行定时任务!"); //……定时任务代码 } }; long delay = 3; //推迟多久后开始执行定时任务,这里推迟3s long period = 1; //时间间隔 ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); executorService.scheduleAtFixedRate(runnable, delay, period,TimeUnit.SECONDS); } }
注意:这里是以秒为单位
相关文章推荐
- ruby中执行周期性任务(定时任务)的3种方法
- C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析
- C#使用timer实现的简单闹钟程序
- C#中timer定时器用法实例
- 使用mysql事件调度器定时删除binlog
- C#自定义基于控制台的Timer实例
- C#中的Timer和DispatcherTimer使用实例
- php实现的Timer页面运行时间监测类
- .NET中的Timer类型用法详解
- ASP中实现执行定时任务的方法
- asp.net中Timer无刷新定时器的实现方法
- node.js中使用node-schedule实现定时任务实例
- php定时计划任务的实现方法详解
- C#使用timer定时在屏幕上输出信息的方法
- Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
- Android Timer使用的实例代码
- PHP中使用sleep函数实现定时任务实例分享
- PHP定时执行任务实现方法详解(Timer)
- yii框架通过控制台命令创建定时任务示例
- linux使用crontab实现PHP执行计划定时任务