做一个bat 放到计划任务中。

解决方案 »

  1.   

    是要用Timer的,但是每隔1分钟run一次就OK了,然后在run方法内getCurrentTime();
    看看是不是早上8点了。
      

  2.   

    没半个小时一次也可以
    Calendar cal=Calendar.getInstance();
    int time=cal.get(Calendar.HOUR_OF_DAY)
      

  3.   

    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的我试了,没弄好,就写这么一个笨方法了
      

  4.   

    楼主试试这样行不行:
    每隔半个小时或者一个小时检查一次,然后根据距离8点还剩下的时间来调整检查的间隔时间,比如还剩下2小时到8点就改成半个小时检查一次,还剩下1个小时到8点那就改成10分钟检查一次。PS:我没试过这样行不行。别的项目里有这样的需求,用的是Spring里面的Quatz做的定时任务管理
      

  5.   


    8楼兄弟的也是一种思路,把剩下的时间用来sleep,不过sleep并不可靠,或者说不精确,是不是可以用别的办法?
      

  6.   

    使用quartz很简单的了。可以很灵活的配置。
      

  7.   

    我也怀疑sleep用起来不保险。
      

  8.   

    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文件解析执行器)!---");
    } }}
      

  9.   

    使用quartz吧,对于你的问题很方便
      

  10.   

    最好还是系统级别的定时任务,java定时需要java一直都是启动状态。
      

  11.   

    我也感觉用纯java代码来控制这个,是有点虚。
    但你说的系统级别的定时任务,是指windows系统或者linux系统,这种级别的?
    能不能说明下呢?
      

  12.   

    用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”参数时,不要指定列表或范围,因为这会导致问题 
      

  13.   

    有以下方法:1.用 Spring 的 timetask2.直接用 Windows控制面板中的任务计划:
      1)写个.bat 直接运行你的Java程序就行了,classpath有必要就配置一下。
      2)任务计划指定到你的.bat就可以了。3.做个JavaWrapper,安装后形式是 WindowsService.程序里面用 while sleep等做循环检测就可以了。
      

  14.   

      定个7:58的。。
         开机执行Java程序两分钟嘿嘿
      

  15.   

    不知道楼主就是想用JAVA实现呢?还是单纯想定时执行这个程序。如果单纯想定时执行这个程序,那就写一个批处理文件,在里面用java命令调用这个程序,然后把这个批处理文件加到windows的计划任务里定时执行就行了吧......
      

  16.   

    控制线程睡眠时间是最不好的办法。几乎任何语言的定时任务都应该用quartz来解决String schedule = "00 08 * * *";上面的String里的字节分别代表:分钟 小时 日期 月份 星期几这样不但稳定,而且容易控制和修改。还有更复杂的设置,可以让计划任务精确到秒,lz可以搜索一下学习学习。
      

  17.   


    你说的是用quartz来实现?
    这个还真没有用过。
      

  18.   

       对于Quartz框架来说。
        能用java能实现的定时时间的就不用Quartz
        如果你需要复杂的时间定位。。
        比如:我每年的某一个月的每个双日的每天早上8:00执行什么什么。。
        那选择Quartz吧它将给你带来方便。。

      上面的话来自Quartz的帮助文档