java 定时器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 定时器相关的知识,希望对你有一定的参考价值。

做一个功能,每天07:00自动打印一句话出来,"起床啦!起床啦!",然后写入一个txt文件,文件名是当天的日期。

java API里的定时器只有延时86400000毫秒(24小时)才能实现,太麻烦了还会出错,有没有其他办法呢?
唉,哥们,你的方法是每秒判断一次是不是 07:00 ,一共的判断 86400次,有点占用CPU啊 。我如果有十个线程都要开定时器 就不能这样做了. 辛苦你写这么多啦

说白了 我就是要做一个像日志记录 这样子的东东,能自动生成文件,把程序得到的数据记录进去

Timer.scheduledAtFixTime(TimerTask task,
long delay,
long period)

里面的delay不是延时多久后就执行吗? 每天执行一次timer的话,延时就是24小时啊

配置web.xml
<listener>
<listener-class>com.yohn.timer.ExecTimer</listener>
</listener>

********************************************************************

java源文件
package com.yohn.timmer;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class SetTimerExecute extends TimerTask implements ServletContextListener


public void contextDestroyed(ServletContextEvent arg0)

System.out.println("服务器停止");


public void contextInitialized(ServletContextEvent arg0)

System.out.println("服务器启动");
//新建一个时间控件
Timer t = new Timer();
//指定的任务从指定的延迟后开始进行重复的固定延迟执行。
t.schedule(new SetTimerExecute(),1000,1000);


public void run()

FileWriter fs = null;
BufferedWriter buf = null;
try

File f = new File("/test.txt");
if (!f.exists())
f.createNewFile();
fs = new FileWriter(f,true);
buf = new BufferedWriter(fs);
//每天上午7点写入到文件
if(new Date().getHours()==7)

SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");

System.out.print("起床啦!起床啦!");
f.write("定时打印:" + myFormatter.format(new Date();));
buf.newLine();


catch (Exception e)

e.printStackTrace();

finally

try

buf.flush();
fs.close();

catch (IOException e)





参考技术A 参考以下代码:
public class AlarmClock

private final Scheduler scheduler = new Scheduler();
private final SimpleDateFormat dateFormat =
new SimpleDateFormat("dd MMM yyyy HH:mm:ss.SSS");
private final int hourOfDay, minute, second;

public AlarmClock(int hourOfDay, int minute, int second)
this.hourOfDay = hourOfDay;
this.minute = minute;
this.second = second;


public void start()
scheduler.schedule(new SchedulerTask()
public void run()
soundAlarm();

private void soundAlarm()
System.out.println("Wake up! " +
"It's " + dateFormat.format(new Date()));
// Start a new thread to sound an alarm...

, new DailyIterator(hourOfDay, minute, second));


public static void main(String[] args)
AlarmClock alarmClock = new AlarmClock(7, 0, 0);
alarmClock.start();



public class DailyIterator implements ScheduleIterator
private final int hourOfDay, minute, second;
private final Calendar calendar = Calendar.getInstance();

public DailyIterator(int hourOfDay, int minute, int second)
this(hourOfDay, minute, second, new Date());


public DailyIterator(int hourOfDay, int minute, int second, Date date)
this.hourOfDay = hourOfDay;
this.minute = minute;
this.second = second;
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, second);
calendar.set(Calendar.MILLISECOND, 0);
if (!calendar.getTime().before(date))
calendar.add(Calendar.DATE, -1);



public Date next()
calendar.add(Calendar.DATE, 1);
return calendar.getTime();




public interface ScheduleIterator
public Date next();
本回答被提问者采纳
参考技术B 把打印和写文件放在一个TimerTask子类中
然后通过Timer.scheduledAtFixTime()启动这个task
具体参数请参考API

但是我不太明白你指的“定时器只有延时86400000毫秒(24小时)才能实现,”是什么意思

java定时器 限制方法调用次数

java实现可以限制某方法在规定时间内(比如两分钟)被调用的次数。

参考技术A 添加一个静态常量,每当方法被调用,该常量减1,当该常量为0时,调用该方法就直接退出。 参考技术B java.util.Timer类,这个类是java里的定时器类.schedule()方法重构多次,可以定时重复执行任务.具体使用可以查看手册
给你一个简单的例子..从1000ms开始,每隔1000ms执行一次run方法
package demo;

import java.util.Timer;
import java.util.TimerTask;

public class TimerTest

public static void main(String[] args)
Timer t = new Timer();
t.schedule(new TimerTask()

@Override
public void run()
//这里写你需要执行的任务,需要什么参数可以传进来..
System.out.println("定时任务....");


,1000,1000);


参考技术C 用个全局变量或类变量计数就行了,超过这个数字直接返回

以上是关于java 定时器的主要内容,如果未能解决你的问题,请参考以下文章

java 定时器cancel之后要重启怎么解决

在java中如何让定时器只启动一次?

java定时器 每天凌晨 固定执行一个方法

java 定时器

我要做一个java web的定时器,需要隔一分钟访问一次数据库,请问大神可以给个类似的Demo我吗?

在Java中如何实现较为精确的定时器