想实现个功能,触发某个事件后 执行一个循环 每隔单位时间 执行一段代码 至到满足条件跳出循环或结束程序.
不知道有什么方法实现 每隔单位时间,Thread.sleep, timer......

解决方案 »

  1.   

    import java.util.Timer;
    import java.util.TimerTask;public class Test {
        public static void main(String[] args) {
            final Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                int count = 0;            @Override
                public void run() {
                    System.out.println(count);
                    ++count;
                    if (count > 10) {
                        timer.cancel();
                        System.out.println("Timer is stopped.");
                    }
                }
            }, 0, 500);
        }
    }
      

  2.   

    时间长的话 用crontab 或 计划任务
      

  3.   


    //通过定时器进行任务的执行是比较常见的情况,下面的是个简单的示例:主要借助于监听器和TimerTask
    //和Timer类进行实现,另外spring提供了定时器的高级实现好像是quarts.     package com.rx.timer;
      import java.util.Date;
      import java.util.TimerTask;
      public class MyTask extends TimerTask {
      @Override
      public void run() {
      System.out.println("call at " + (new Date()));
      }
      }
      package com.rx.timer;
      import java.util.Timer;
      import javax.servlet.ServletContextEvent;
      import javax.servlet.ServletContextListener;
      public class MyListen implements ServletContextListener {
      private Timer timer = null;
      @Override
      public void contextDestroyed(ServletContextEvent arg0) {
      timer.cancel();
      }
      @Override
      public void contextInitialized(ServletContextEvent arg0) {
      timer = new Timer(true);
      //设置任务计划,启动和间隔时间
      timer.schedule(new MyTask(), 0, 1000 * 10);      //或者 timer.schedule(new MyTask(), new Date(), 1000 * 10);      //第一个参数指定执行的线程,第二个参数指定第一次日期执行的时间,第三个参数指定每格多久再次执行一次
      }
         }
      

  4.   


    --Oracle中的定时器
    begin
      sys.dbms_job.submit(job => :job,
                          what => 'check_err;',
                          next_date => trunc(sysdate)+23/24,
                          interval => 'trunc(next_day(sysdate,''星期五''))+23/24');
      commit;
    end;
    /*
       其中:job是系统自动产生编号,check_err是自己的一个过程或函数,next_date设置下次执行时间,这里是今天晚上23:00,interval设置时间间隔,多久执行一次,这里是每周的星期五晚上23:00,函数next_day返回日期中包含指定字符的日期,trunc 函数去掉日期里的时间,也就是得到的是某天的00:00,时间是以天为单位的所以要得到某某点某某分,就需要分数:
    */--1、 每分钟执行
    Interval => TRUNC(sysdate,’mi’) + 1 / (24*60)--2、 每天定时执行例如:每天的凌晨2点执行Interval => TRUNC(sysdate) + 1 +2 / (24)--3、 每周定时执行--例如:每周一凌晨2点执行Interval => TRUNC(next_day(sysdate,'星期一'))+2/24--4、 每月定时执行--例如:每月1日凌晨2点执行Interval =>TRUNC(LAST_DAY(SYSDATE))+1+2/24--5、 每季度定时执行--例如每季度的第一天凌晨2点执行Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 2/24--6、 每半年定时执行--例如:每年7月1日和1月1日凌晨2点Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24--7、 每年定时执行--例如:每年1月1日凌晨2点执行Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24
     
      

  5.   

    过了周末,回来看这么多人回复,谢谢如果用timer的话,那么是不是每次请求就有一个线程,如果我的请求很多的话线程就很多了,如果用quartz这种计划任务每秒调度一次会不会更好点