日期:2014-05-20  浏览次数:20836 次

如何定义一个循环,每秒循环一次
写一个监听类,想要实现类似的功能,求思路

------解决方案--------------------
可以用多线程的方法。在一个线程里面实现一个循环 设置这个县城Thread.sleep(1000)来实现。但是多线程里面的线程机制调用的确定性 没深入研究。还有个定时器类 Timer  可以实现这个类是显示的  
------解决方案--------------------
引用:
一般情况 也就是定时器了,time 或spring 定时器,  但是 你的循环方法要是1秒钟执行不完,怎么办?
也就是说,循环方法 执行一次就需要2秒,却每隔1秒 又要循环一次?


如果要做成每次都定点循环的话,可以用timer每个一秒跑一次;
如果做成当此次循环结束1秒后再循环的话,就直接在for里面,执行完操作后,加个sleep(1000)就可以了。
------解决方案--------------------
引用:
如果要做成每次都定点循环的话,可以用timer每个一秒跑一次;
如果做成当此次循环结束1秒后再循环的话,就直接在for里面,执行完操作后,加个sleep(1000)就可以了。

你再看一下标题,再看看我说的,  
1秒循环一次  不是休息1秒 就算1秒循环1次的。timer 也一样。
循环方法要是1秒钟执行不完,怎么办?
也就是说,循环方法 执行一次就需要2秒,你却每隔1秒 又要循环一次? 
------解决方案--------------------
引用:
一般情况 也就是定时器了,time 或spring 定时器,  但是 你的循环方法要是1秒钟执行不完,怎么办?
也就是说,循环方法 执行一次就需要2秒,却每隔1秒 又要循环一次?


试了一下,用Timer或ScheduledThreadPoolExecutor都不行,都是等上一次任务执行完之后再执行下一个任务 , 但是用Quartz 是可以的。
需要 quartz-all-2.1.6.jar 包


package com.zf.qzuarz;
import java.util.concurrent.TimeUnit;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job {
  
    public void execute(JobExecutionContext context)
        throws JobExecutionException {
     try {
     System.out.println("execute start ....");
TimeUnit.SECONDS.sleep(3); //睡眠3s
System.out.println("execute end ....");
} catch (InterruptedException e) {
e.printStackTrace();  
}
    }

}




package com.zf.qzuarz;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class SimpleExample {

public void run() throws Exception {
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();

JobDetail job = JobBuilder.newJob(HelloJob.class)
.withIdentity("job1", "group1")
.build();

CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0/1 * * * * ?"))
.build();

sched.scheduleJob(job, trigger);
sched.start();
}

public static void main(String[] args) throws Exception {

SimpleExample example = new SimpleExample();
example.run();

}

}