定时 每天早上08:00执行 做一个bat 放到计划任务中。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是要用Timer的,但是每隔1分钟run一次就OK了,然后在run方法内getCurrentTime();看看是不是早上8点了。 没半个小时一次也可以Calendar cal=Calendar.getInstance();int time=cal.get(Calendar.HOUR_OF_DAY) public class AutoBakThread implements Runnable{ private AutoBak autoBak = new AutoBak();//另外一个类,自动备份文件用的,这里你可以换成自己要执行的类,或者在下面写自己的方法也行 private long delay = 1000; public void run() { while(true) { try { Date date = new Date(); Date execute = new Date(); execute.setHours(23); execute.setMinutes(0); execute.setSeconds(0); //设定每天晚上23:00:00备份文件 if(this.delay > 0) { this.delay = execute.getTime() - date.getTime(); System.out.println("ResetThisDelay:\t" + this.delay + "..."); } if(delay > 0) { System.out.println("Wait for\t" + delay + " ms!" ); Thread.sleep(delay); } this.autoBak.bakFile();//调用备份文件类里的自动别分文件方法 this.delay = 0; System.out.println("Sleep a day... ..."); Thread.sleep(1000*60*60*24); //线程休眠一天,明天同一时间自动备份,下次将跳过前面的延迟,自动备份 } catch (InterruptedException e) { e.printStackTrace(); } } } }作为参考吧,那个timer的我试了,没弄好,就写这么一个笨方法了 楼主试试这样行不行:每隔半个小时或者一个小时检查一次,然后根据距离8点还剩下的时间来调整检查的间隔时间,比如还剩下2小时到8点就改成半个小时检查一次,还剩下1个小时到8点那就改成10分钟检查一次。PS:我没试过这样行不行。别的项目里有这样的需求,用的是Spring里面的Quatz做的定时任务管理 8楼兄弟的也是一种思路,把剩下的时间用来sleep,不过sleep并不可靠,或者说不精确,是不是可以用别的办法? 使用quartz很简单的了。可以很灵活的配置。 我也怀疑sleep用起来不保险。 package com.em.acceptfile.listener;import java.util.Date;import java.util.Timer;import javax.servlet.ServletContext;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import com.em.acceptfile.task.FileCopyTask;import com.em.acceptfile.task.OperatorDBTask;import com.em.acceptfile.task.OperatorSocket;/** * * @author libin * @deprecated 铁道部监听器 * @since 2009-09-10 * */public class AcceptFileListener implements ServletContextListener { //定时器 private static Timer timerForSocket = null; private static Timer timer = null; private static Timer timerForFile = null; private static int port = 9001; //用于取得当前时间 Date date = new Date(); /** * 销毁操作 */ public void contextDestroyed(ServletContextEvent event) { //这里定义两个Timer对象,避免一个Timer对象执行两个TimerTask任务时造成线程阻塞 timerForSocket.cancel(); timer.cancel(); timerForFile.cancel(); event.getServletContext().log("监听器已销毁,任务执行结束"); } /** * 初始操作 */ public void contextInitialized(ServletContextEvent event) { //建立定时器对象 timerForSocket = new Timer(true); timer = new Timer(true); timerForFile = new Timer(true); //得到Context上下文 ServletContext ctx = event.getServletContext(); ctx.log("铁道部监听器已启动,任务开始执行"); ctx.log("监听器DB操作开始执行"); //首先执行Socket timerForSocket.schedule(new OperatorSocket(), 30*1000, //表示Web容器启动20秒后就立即执行此任务 5*60*1000); //任务的执行时间间隔【单位:毫秒】(此处的间隔时间为5min) System.out.println("------OperatorDBTask Timer(数据库XML文件解析器) is Begin!-------"); //执行解析文件操作数据库,传递当前日期变量 timer.schedule(new OperatorDBTask(date), // 所需要执行的任务 40*1000, // 延迟时间(0 --- 表示起动Web容器(或服务器)就立即执行此任务) 15*60*1000 // 任务的执行间隔时间[单位:毫秒] (此处的间隔时间是15min) ); //远程备份文件 System.out.println("------FileCopyTask Timer (远程文件备份) is Begin!---------"); timerForFile.schedule(new FileCopyTask(port,date,ctx.getRealPath("/")), 50*1000, 15*60*1000); } }package com.em.acceptfile.task;import java.util.Date;import java.util.TimerTask;import com.em.acceptfile.execute.TaskExecute;/** * TimerTask 继承类,具备多线程的能力,通过Timer类启动线程的执行 执行TaskExecute(date)任务 * * @author LIBIN * */public class OperatorDBTask extends TimerTask { // 日期变量,接收传递过来的当前日期变量 private Date date; /** * 构造函数,接收当前日期对象 * * @param date * 当前日期对象 */ public OperatorDBTask(Date date) { this.date = date; } // 判断是否正在运行 public static boolean running = false; @SuppressWarnings("deprecation") @Override /** * 线程执行 */ public void run() { // TODO Auto-generated method stub if (!running) { running = true; // 添加计划调度任务 new TaskExecute(date); // 正常执行结束后,复原 running = false; } else { System.out .println("---OperatorDBTask task(数据库XML文件解析任务器) is running!---"); } }}package com.em.acceptfile.execute;import java.util.Date;import com.em.util.FileTraverse;/** * 数据库XML文件解析执行器 * * @author libin * */public class TaskExecute { @SuppressWarnings("deprecation") /** * 构造函数,接收当前日期变量 */ public TaskExecute(Date date) { // TODO Auto-generated constructor stub // 定点执行文件解析任务 int hours = date.getHours(); // 定点 执行的时间 if (hours == 16) { try { // 解析C:\\em\目录下的XML文件,把相应的数据插入对应表中 new FileTraverse().insertDB(); } catch (Exception e) { e.printStackTrace(); } } else { System.out.println("---非定点执行TaskExecute(数据库XML文件解析执行器)!---"); } }} 使用quartz吧,对于你的问题很方便 最好还是系统级别的定时任务,java定时需要java一直都是启动状态。 我也感觉用纯java代码来控制这个,是有点虚。但你说的系统级别的定时任务,是指windows系统或者linux系统,这种级别的?能不能说明下呢? 用spring 吧!在spring配置文件applicationContext.xml中加入<!-- 定时执行 开始 --><bean id="methodInvokingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref bean="chargelogDao" /> </property> <property name="targetMethod"> <value>dingshi</value> </property></bean><bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="methodInvokingJobDetail" /> </property> <property name="cronExpression"> <value>0 1 6,16,20 * * ?</value> <!-- 0 0 10,14,16 * * ? 每天上午10点,下午2点,4点--> </property></bean><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref local="cronTrigger" /> </list> </property></bean><!-- 定时执行 结束 -->chargelogDao为定时执行的类,dingshi为定时执行的方法时间设置说明:一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。按顺序依次为 1.秒(0~59) 2.分钟(0~59) 3.小时(0~23) 4.天(月)(0~31,但是你需要考虑你月的天数) 5.月(0~11) 6.天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT) 7.年份(1970-2099)其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?. 0 0 10,14,16 * * ? 每天上午10点,下午2点,4点0 0/30 9-17 * * ??? 朝九晚五工作时间内每半小时0 0 12 ? * WED 表示每个星期三中午12点 有些子表达式能包含一些范围或列表 例如:子表达式(天(星期))可以为 “MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT” “*”字符代表所有可能的值 因此,“*”在子表达式(月)里表示每个月的含义,“*”在子表达式(天(星期))表示星期的每一天 “/”字符用来指定数值的增量 例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟 ;在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样 “?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值 当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?” “L” 字符仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写 但是它在两个子表达式里的含义是不同的。 在天(月)子表达式中,“L”表示一个月的最后一天 ,在天(星期)自表达式中,“L”表示一个星期的最后一天,也就是SAT 如果在“L”前有具体的内容,它就具有其他的含义了 例如:“6L”表示这个月的倒数第6天,“FRIL”表示这个月的最后一个星期五 注意:在使用“L”参数时,不要指定列表或范围,因为这会导致问题 有以下方法:1.用 Spring 的 timetask2.直接用 Windows控制面板中的任务计划: 1)写个.bat 直接运行你的Java程序就行了,classpath有必要就配置一下。 2)任务计划指定到你的.bat就可以了。3.做个JavaWrapper,安装后形式是 WindowsService.程序里面用 while sleep等做循环检测就可以了。 定个7:58的。。 开机执行Java程序两分钟嘿嘿 不知道楼主就是想用JAVA实现呢?还是单纯想定时执行这个程序。如果单纯想定时执行这个程序,那就写一个批处理文件,在里面用java命令调用这个程序,然后把这个批处理文件加到windows的计划任务里定时执行就行了吧...... 控制线程睡眠时间是最不好的办法。几乎任何语言的定时任务都应该用quartz来解决String schedule = "00 08 * * *";上面的String里的字节分别代表:分钟 小时 日期 月份 星期几这样不但稳定,而且容易控制和修改。还有更复杂的设置,可以让计划任务精确到秒,lz可以搜索一下学习学习。 你说的是用quartz来实现?这个还真没有用过。 对于Quartz框架来说。 能用java能实现的定时时间的就不用Quartz 如果你需要复杂的时间定位。。 比如:我每年的某一个月的每个双日的每天早上8:00执行什么什么。。 那选择Quartz吧它将给你带来方便。。 上面的话来自Quartz的帮助文档 返回值的问题 如何获取BigDecimal的负数 求大侠帮忙~ JAVA与C#是不是有点相似 关于Java位移的问题?请高手帮忙! 复杂的路径问题(非高手莫入) jsp中,如何判断一个按钮是否按下—— String lineEnd = System.getProperty("line.separator")是什么意思如何处理?? 为何编译不通过?怎么办解决? 消息中间件的功能?各位铜人帮忙! 正则表达式 replaceAll的问题 菜鸟求助如何添加键盘监听事件
看看是不是早上8点了。
Calendar cal=Calendar.getInstance();
int time=cal.get(Calendar.HOUR_OF_DAY)
private AutoBak autoBak = new AutoBak();//另外一个类,自动备份文件用的,这里你可以换成自己要执行的类,或者在下面写自己的方法也行
private long delay = 1000;
public void run() {
while(true) {
try {
Date date = new Date();
Date execute = new Date();
execute.setHours(23);
execute.setMinutes(0);
execute.setSeconds(0);
//设定每天晚上23:00:00备份文件
if(this.delay > 0) {
this.delay = execute.getTime() - date.getTime();
System.out.println("ResetThisDelay:\t" + this.delay + "...");
}
if(delay > 0) {
System.out.println("Wait for\t" + delay + " ms!" );
Thread.sleep(delay);
}
this.autoBak.bakFile();//调用备份文件类里的自动别分文件方法
this.delay = 0;
System.out.println("Sleep a day... ...");
Thread.sleep(1000*60*60*24);
//线程休眠一天,明天同一时间自动备份,下次将跳过前面的延迟,自动备份
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
作为参考吧,那个timer的我试了,没弄好,就写这么一个笨方法了
每隔半个小时或者一个小时检查一次,然后根据距离8点还剩下的时间来调整检查的间隔时间,比如还剩下2小时到8点就改成半个小时检查一次,还剩下1个小时到8点那就改成10分钟检查一次。PS:我没试过这样行不行。别的项目里有这样的需求,用的是Spring里面的Quatz做的定时任务管理
8楼兄弟的也是一种思路,把剩下的时间用来sleep,不过sleep并不可靠,或者说不精确,是不是可以用别的办法?
import java.util.Timer;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;import com.em.acceptfile.task.FileCopyTask;
import com.em.acceptfile.task.OperatorDBTask;
import com.em.acceptfile.task.OperatorSocket;
/**
*
* @author libin
* @deprecated 铁道部监听器
* @since 2009-09-10
*
*/
public class AcceptFileListener implements ServletContextListener {
//定时器
private static Timer timerForSocket = null;
private static Timer timer = null;
private static Timer timerForFile = null;
private static int port = 9001;
//用于取得当前时间
Date date = new Date();
/**
* 销毁操作
*/
public void contextDestroyed(ServletContextEvent event) {
//这里定义两个Timer对象,避免一个Timer对象执行两个TimerTask任务时造成线程阻塞
timerForSocket.cancel();
timer.cancel();
timerForFile.cancel();
event.getServletContext().log("监听器已销毁,任务执行结束");
}
/**
* 初始操作
*/
public void contextInitialized(ServletContextEvent event) {
//建立定时器对象
timerForSocket = new Timer(true);
timer = new Timer(true);
timerForFile = new Timer(true);
//得到Context上下文
ServletContext ctx = event.getServletContext();
ctx.log("铁道部监听器已启动,任务开始执行");
ctx.log("监听器DB操作开始执行");
//首先执行Socket
timerForSocket.schedule(new OperatorSocket(),
30*1000, //表示Web容器启动20秒后就立即执行此任务
5*60*1000); //任务的执行时间间隔【单位:毫秒】(此处的间隔时间为5min)
System.out.println("------OperatorDBTask Timer(数据库XML文件解析器) is Begin!-------");
//执行解析文件操作数据库,传递当前日期变量
timer.schedule(new OperatorDBTask(date), // 所需要执行的任务
40*1000, // 延迟时间(0 --- 表示起动Web容器(或服务器)就立即执行此任务)
15*60*1000 // 任务的执行间隔时间[单位:毫秒] (此处的间隔时间是15min)
);
//远程备份文件
System.out.println("------FileCopyTask Timer (远程文件备份) is Begin!---------");
timerForFile.schedule(new FileCopyTask(port,date,ctx.getRealPath("/")),
50*1000,
15*60*1000);
}
}
package com.em.acceptfile.task;import java.util.Date;
import java.util.TimerTask;import com.em.acceptfile.execute.TaskExecute;/**
* TimerTask 继承类,具备多线程的能力,通过Timer类启动线程的执行 执行TaskExecute(date)任务
*
* @author LIBIN
*
*/
public class OperatorDBTask extends TimerTask {
// 日期变量,接收传递过来的当前日期变量
private Date date; /**
* 构造函数,接收当前日期对象
*
* @param date
* 当前日期对象
*/
public OperatorDBTask(Date date) {
this.date = date;
} // 判断是否正在运行
public static boolean running = false; @SuppressWarnings("deprecation")
@Override
/**
* 线程执行
*/
public void run() {
// TODO Auto-generated method stub
if (!running) {
running = true;
// 添加计划调度任务
new TaskExecute(date);
// 正常执行结束后,复原
running = false;
} else {
System.out
.println("---OperatorDBTask task(数据库XML文件解析任务器) is running!---");
} }}
package com.em.acceptfile.execute;import java.util.Date;import com.em.util.FileTraverse;/**
* 数据库XML文件解析执行器
*
* @author libin
*
*/
public class TaskExecute { @SuppressWarnings("deprecation")
/**
* 构造函数,接收当前日期变量
*/
public TaskExecute(Date date) {
// TODO Auto-generated constructor stub
// 定点执行文件解析任务
int hours = date.getHours();
// 定点 执行的时间
if (hours == 16) {
try {
// 解析C:\\em\目录下的XML文件,把相应的数据插入对应表中
new FileTraverse().insertDB();
} catch (Exception e) {
e.printStackTrace();
} } else {
System.out.println("---非定点执行TaskExecute(数据库XML文件解析执行器)!---");
} }}
但你说的系统级别的定时任务,是指windows系统或者linux系统,这种级别的?
能不能说明下呢?
在spring配置文件applicationContext.xml中加入<!-- 定时执行 开始 -->
<bean id="methodInvokingJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="chargelogDao" />
</property>
<property name="targetMethod">
<value>dingshi</value>
</property>
</bean>
<bean id="cronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="methodInvokingJobDetail" />
</property>
<property name="cronExpression">
<value>0 1 6,16,20 * * ?</value>
<!-- 0 0 10,14,16 * * ? 每天上午10点,下午2点,4点-->
</property>
</bean>
<bean
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="cronTrigger" />
</list>
</property>
</bean>
<!-- 定时执行 结束 -->chargelogDao为定时执行的类,dingshi为定时执行的方法时间设置说明:
一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。
按顺序依次为
1.秒(0~59)
2.分钟(0~59)
3.小时(0~23)
4.天(月)(0~31,但是你需要考虑你月的天数)
5.月(0~11)
6.天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
7.年份(1970-2099)其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。
由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?. 0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ??? 朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点 有些子表达式能包含一些范围或列表
例如:子表达式(天(星期))可以为 “MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT” “*”字符代表所有可能的值
因此,“*”在子表达式(月)里表示每个月的含义,“*”在子表达式(天(星期))表示星期的每一天 “/”字符用来指定数值的增量
例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟 ;
在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样 “?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值
当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”
“L” 字符仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写 但是它在两个子表达式里的含义是不同的。 在天(月)子表达式中,“L”表示一个月的最后一天 ,
在天(星期)自表达式中,“L”表示一个星期的最后一天,也就是SAT 如果在“L”前有具体的内容,它就具有其他的含义了 例如:“6L”表示这个月的倒数第6天,“FRIL”表示这个月的最后一个星期五 注意:在使用“L”参数时,不要指定列表或范围,因为这会导致问题
1)写个.bat 直接运行你的Java程序就行了,classpath有必要就配置一下。
2)任务计划指定到你的.bat就可以了。3.做个JavaWrapper,安装后形式是 WindowsService.程序里面用 while sleep等做循环检测就可以了。
开机执行Java程序两分钟嘿嘿
你说的是用quartz来实现?
这个还真没有用过。
能用java能实现的定时时间的就不用Quartz
如果你需要复杂的时间定位。。
比如:我每年的某一个月的每个双日的每天早上8:00执行什么什么。。
那选择Quartz吧它将给你带来方便。。
上面的话来自Quartz的帮助文档