
正文
java定时任务代码 java实现定时任务的三种方法
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
java间隔指定时间后运行代码可取消
java间隔指定时间后运行代码可取消
java间隔指定时间后运行代码可取消定时任务
使用java.util.Timer类来实现定时任务,它可以定期执行任务,也可以在指定的时间点执行任务。
示例代码:
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest {
public static void main(String[] args) {
// 创建一个定时器
Timer timer = new Timer();
// 创建一个定时任务
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("定时任务开始执行");
}
};
// 使用定时器安排定时任务在2秒后开始执行,每隔2秒重复执行
timer.schedule(task, 2000, 2000);
// 取消定时任务
timer.cancel();
}
}
相关问答
Q1: java怎么用定时任务实现失效
1、ZSet 实现方式
通过 ZSet 实现定时任务的思路是,将定时任务存放到 ZSet 集合中,并且将过期时间存储到 ZSet 的 Score 字段中,然后通过一个无线循环来判断当前时间内是否有需要执行的定时任务,如果有则进行执行,具体实现代码如下:
import redis.clients.jedis.Jedis;
import utils.JedisUtils;
import java.time.Instant;
import java.util.Set;
public class DelayQueueExample {
private static final String _KEY = "DelayQueueExample";
public static void main(String[] args) throws InterruptedException {
Jedis jedis = JedisUtils.getJedis();
// 30s 后执行
long delayTime = Instant.now().plusSeconds(30).getEpochSecond();
jedis.zadd(_KEY, delayTime, "order_1");
// 继续添加测试数据
jedis.zadd(_KEY, Instant.now().plusSeconds(2).getEpochSecond(), "order_2");
jedis.zadd(_KEY, Instant.now().plusSeconds(2).getEpochSecond(), "order_3");
jedis.zadd(_KEY, Instant.now().plusSeconds(7).getEpochSecond(), "order_4");
jedis.zadd(_KEY, Instant.now().plusSeconds(10).getEpochSecond(), "order_5");
// 开启定时任务队列
doDelayQueue(jedis);
}
/**
* 定时任务队列消费
* @param jedis Redis 客户端
*/
public static void doDelayQueue(Jedis jedis) throws InterruptedException {
while (true) {
// 当前时间
Instant nowInstant = Instant.now();
long lastSecond = nowInstant.plusSeconds(-1).getEpochSecond();
// 上一秒时间
long nowSecond = nowInstant.getEpochSecond();
// 查询当前时间的所有任务
Set data = jedis.zrangeByScore(_KEY, lastSecond, nowSecond);
for (String item : data) {
// 消费任务
System.out.println("消费:" + item);
}
// 删除已经执行的任务
jedis.zremrangeByScore(_KEY, lastSecond, nowSecond);
Thread.sleep(1000); // 每秒查询一次
}
}
}
登录后复制

2、键空间通知
我们可以通过 Redis 的键空间通知来实现定时任务,它的实现思路是给所有的定时任务设置一个过期时间,等到了过期之后,我们通过订阅过期消息就能感知到定时任务需要被执行了,此时我们执行定时任务即可。
默认情况下 Redis 是不开启键空间通知的,需要我们通过 config set notify-keyspace-events Ex 的命令手动开启,开启之后定时任务的代码如下
Q2: java定时任务每天多个时间点怎么办
1、创建ScheduledExecutorService对象java定时任务代码,用于执行定时任务。
2、使用scheduleAtFixedRate()方法来设置定时任务java定时任务代码,该方法可以指定任务java定时任务代码的初始延迟时间、任务运行周期等参数。
3、在定时任务的run()方法中编写任务代码,实现需要执行的业务逻辑。
4、在程序启动时,调用ScheduledExecutorService对象的shutdown()方法来关闭定时任务。
Q3: 在Java中如何设置一个定时任务,在每天的一个时间点自动执行一个特定的程序?具体代码怎么写?代码全点
Quartz定时机制
首先导入jar包到程序内 quartz-all-1.6.0.jar
然后创建一个XML
TimeConfig.xml 名字可以自己定义
?xml version="1.0" encoding="UTF-8"?
!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
""
beans
bean id="mainTask" class="net.timed.MainTask"/ //你要执行的任务类
//jar类
bean id="mainJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
property name="targetObject"
ref bean="mainTask"///将你的类添加到定时器当中
/property
property name="targetMethod"
valueexecute/value //定时执行类里面的哪个方法
/property
/bean
bean id="timeTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"
property name="jobDetail"
ref bean="mainJob"/
/property
!--
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
上面这个是quartz的语法 定时单位
--
property name="cronExpression"
value0 0/5 * * * ?/value //定时的语法
/property
/bean
bean id="sfb" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
property name="triggers"
list
ref local="timeTrigger"/
/list
/property
/bean
/beans
//下面这个类就是我在XML中引入的类
package net.timed;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainTask {
public void execute() throws IOException
{
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("do my job"+dateFormat.format(new Date()));
Runtime.getRuntime().exec("cmd /c start E:/mbl/BusinessOffice/MoneDB/bin/bakup.bat");
}
}
然后在web.xml中把这个TimeConfig.xml添加进去作为监听
系统启动的时候自动就监听这个事件
?xml version="1.0" encoding="UTF-8"?
web-app version="2.5"
xmlns=""
xmlns:xsi=""
xsi:schemaLocation="
"
context-param
param-name
contextConfigLocation
/param-name
param-value
/WEB-INF/TimerConfig.xml
/param-value
/context-param
listener
listener-class
org.springframework.web.context.ContextLoaderListener
/listener-class
/listener
welcome-file-list
welcome-fileindex.jsp/welcome-file
/welcome-file-list
/web-app
这个是quartz spring的定时机制 请仔细的看看 如果可以请给分哦
Q4: JAVA中定时自动完成任务的实现
JAVA中定时自动完成任务的实现要用到JAVA中的定时器TimerTask和监听器 听起来貌似有点困难但是实现起来还是比较容易的!纸老虎~~!
下面的列子很详细 是关于定时向服务器上传(也可以是其他的动作这是看需要关于上传我博客有写过可以参考)文件的列子简单的 步就可以实现
首先创建动作bean
package sun time ;
public class UploadFile{
/**
*实现上传的代码s省略 可以看下我下面的 篇日志
__haiming/blog/static/ / 使用 *** arupload 实现上传下载[有例子]
__haiming/blog/static/ / 使用Struts 多文件上传
*/
public void upload()
{
System out println( 系统自动的上传文件了 );
}
}
创建定时器MyTaker并完成相应的功能
package sun time ;
import java util Calendar;
import java util TimerTask;
import javax servlet ServletContext;
public class MyTaker extends TimerTask {
private static boolean isRun = false;
private ServletContext context ;
private Calendar ca = Calendar getInstance();
public MyTaker(ServletContext context)
{
ntext = context;
}
@Override
public void run() {
if(!isRun){
if( ==ca get(Calendar MINUTE)){
isRun = true;
context log( 正在执行所加载的任务 );
UploadFile uf= new UploadFile();
uf upload();
isRun =false;
context log( 任务顺利完成 );
}
}
else
{
System out println( 任务还没有执行完毕 );
}
}
}
创建监听器ContextListener
package sun time ;
import javax servlet ServletContextEvent;
import javax servlet ServletContextListener;
import sun time MyTaker;
import java util *;
public class ContexListener implements ServletContextListener{
private Timer timer = null;
@Override
public void contextDestroyed(ServletContextEvent event) {
timer cancel();
event getServletContext() log( 任务列表已经销毁了 );
}
@Override
public void contextInitialized(ServletContextEvent event) {
timer = new Timer(true);
event getServletContext() log( 服务器已经启动了 );
timer schedule(new MyTaker(event getServletContext()) );///每隔多长时间检查扫描一次
event getServletContext() log( 已经加载了任务的列表 );
}
}
最后一步就是在web xml中配置监听
! Java定时器
listener
listener class sun time ContexListener/listener class
lishixinzhi/Article/program/Java/hx/201311/26450
Q5: java代码启动一个定时任务
在应用里经常都有用到在后台跑定时任务的需求。举个例子,比如需要在服务后台跑一个定时任务来进行非实时计算,清除临时数据、文件等。在本文里,3种不同的实现方法:
普通thread实现
TimerTask实现
ScheduledExecutorService实现
1.普通thread
这是最常见的,创建一个thread,然后让它在while循环里一直运行着,通过sleep方法来达到定时任务的效果。这样可以快速简单的实现,代码如下:
public class Task1 {
public static void main(String[] args) {
// run in a second
final long timeInterval = 1000;
Runnable runnable = new Runnable() {
public void run() {
while (true) {
// ------- code for task to run
System.out.println("Hello !!");
// ------- ends here
try {
Thread.sleep(timeInterval);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread thread = new Thread(runnable);
thread.start();
}
}
2.用Timer和TimerTask
上面的实现是非常快速简便的,但它也缺少一些功能。
用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
}
3.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定时任务代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java实现定时任务的三种方法、java定时任务代码的信息别忘了在本站进行查找喔。





