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小时啊
<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 定时器的主要内容,如果未能解决你的问题,请参考以下文章