How to use Timer class to call a method, do something, reset timer, repeat?

前端 未结 5 999
离开以前
离开以前 2020-11-28 08:33

I\'m a Java beginner and have been futzing around with various solutions to this problem and have gotten myself kind of knotted up. I\'ve tried with Threads and then discove

相关标签:
5条回答
  • 2020-11-28 09:08

    If you don't want to use timer class and can use Quartz then perform it like. My main class would be

    import com.google.common.util.concurrent.AbstractScheduledService;
    import org.quartz.CronScheduleBuilder;
    import org.quartz.JobBuilder;
    import org.quartz.JobDetail;
    import org.quartz.impl.StdSchedulerFactory;
    import org.quartz.*;
    import org.quartz.impl.StdSchedulerFactory;
    import static org.quartz.TriggerBuilder.newTrigger;
    
    import java.util.concurrent.CountDownLatch;
    
    public class Test {
    
    
        public static void main(String[] args) throws Exception{
    
    
            CountDownLatch latch = new CountDownLatch(1);
    
    
            //do schdeuling thing
            JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity(
                    "CronQuartzJob", "Group").build();
    
            // Create a Trigger that fires every 5 minutes.
            Trigger trigger = newTrigger()
                    .withIdentity("TriggerName", "Group")
                    .withSchedule(CronScheduleBuilder.cronSchedule("0/1 * * * * ?"))
                    .build();
    
            // Setup the Job and Trigger with Scheduler & schedule jobs
            final Scheduler scheduler = new StdSchedulerFactory().getScheduler();
            scheduler.start();
            scheduler.scheduleJob(job, trigger);
    
            //
            latch.await();
    
            Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        scheduler.shutdown();
                        latch.countDown();
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }));
    
        }
    
    
    
    
    
    
    }
    

    and job class would be

    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    
    public class SimpleJob implements Job {
    
    
        public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
            System.out.println("executing task!");
        }
    
    
    }
    

    I would create a executable jar for this and start this using java -jar .. & and Ctrl+C can stop that process , If you want it in background disownit

    0 讨论(0)
  • 2020-11-28 09:16

    If you want to simply use Timer, I would do something like this:

    public class TestClass {
        public long myLong = 1234;
    
        public static void main(String[] args) {
            final TestClass test = new TestClass();
    
            Timer timer = new Timer();
            timer.schedule(new TimerTask() {
    
                @Override
                public void run() {
                    test.doStuff();
                }
            }, 0, test.myLong);
        }
    
        public void doStuff(){
            //do stuff here
        }
    }
    

    Sorry for the lousy identation.

    Also, if you need to schedule execution of code, take a look at Guava Services since it can really make your code much clearer and abstract quite a bit of the boilerplate of creating threads, scheduling, etc.

    By the way, I didn't take the trouble of generating random number, etc, but I think you can figure out how to include that part. I hope this is enough to get you on the right track.

    For the record, if you were to use Guava, it would look something like this:

    class CrawlingService extends AbstractScheduledService {
    
        @Override
        protected void runOneIteration() throws Exception {
            //run this alot
        }
    
        @Override
        protected void startUp() throws Exception {
            //anything you need to step up
        }
    
        @Override
        protected void shutDown() throws Exception {
            //anything you need to tear down
        }
    
    
        @Override
        protected Scheduler scheduler() {
            return new CustomScheduler() {
                @Override
                protected Schedule getNextSchedule() throws Exception {
                    long a = 1000; //number you can randomize to your heart's content
                    return new Schedule(a, TimeUnit.MILLISECONDS);
                }
            };
        }
    }
    

    And you would simply create a main that called new CrawlingService.start(); that's it.

    0 讨论(0)
  • 2020-11-28 09:16

    The below code will run at 18:20 and it will repeat itself in interval of 5 sec.

    public static void main(String[] args) {
        Timer timer = new Timer();
        TimerTask tt = new TimerTask() {
            public void run() {
                Calendar cal = Calendar.getInstance();
    
                int hour = cal.get(Calendar.HOUR_OF_DAY);
                int min = cal.get(Calendar.MINUTE);
                if (hour == 18 && min == 20) {
                    doSomething();
                }
            }
        };
        timer.schedule(tt, 1000, 5000);
    }
    
    0 讨论(0)
  • 2020-11-28 09:17

    Do you specifically want a Timer? If not you're probably better off with a ScheduledExecutorService and calling scheduleAtFixedRate or scheduleWithFixedDelay; quoting the Javadocs:

    Java 5.0 introduced the java.util.concurrent package and one of the concurrency utilities therein is the ScheduledThreadPoolExecutor which is a thread pool for repeatedly executing tasks at a given rate or delay. It is effectively a more versatile replacement for the Timer/TimerTask combination, as it allows multiple service threads, accepts various time units, and doesn't require subclassing TimerTask (just implement Runnable). Configuring ScheduledThreadPoolExecutor with one thread makes it equivalent to Timer.

    UPDATE

    Here's some working code using a ScheduledExecutorService:

    import java.util.Date;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    
    public class Test {
        public static void main(String[] args) {
            final ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
            ses.scheduleWithFixedDelay(new Runnable() {
                @Override
                public void run() {
                    System.out.println(new Date());
                }
            }, 0, 1, TimeUnit.SECONDS);
        }
    }
    

    The output looks like:

    Thu Feb 23 21:20:02 HKT 2012
    Thu Feb 23 21:20:03 HKT 2012
    Thu Feb 23 21:20:04 HKT 2012
    Thu Feb 23 21:20:05 HKT 2012
    Thu Feb 23 21:20:06 HKT 2012
    Thu Feb 23 21:20:07 HKT 2012
    
    0 讨论(0)
  • 2020-11-28 09:22

    Think of a scenario where I want my code to execute at a particular time in my application or at sometime later from the current time. In other words, I want to schedule my task at the definite time.

    Java Timer class (java.util.Timer) allows an application to schedule the task on a separate background thread.

    Here is the simplest example of Java Timer:

    import java.util.Timer;
    import java.util.TimerTask;
    public class JavaTimer {
        public static void main(String[] args) {
            Timer timer = new Timer();
            TimerTask task = new TimerTask() {
                @Override
                public void run() {
                    System.out.println("Inside Timer Task" + System.currentTimeMillis());
                }
            };
    
            System.out.println("Current time" + System.currentTimeMillis());
            timer.schedule(task, 10000,1000);
            System.out.println("Current time" + System.currentTimeMillis());
        }
    }
    

    Output:
    Current time1455469505220
    Current time1455469505221
    Inside Timer Task1455469515222
    Inside Timer Task1455469516222
    Inside Timer Task1455469517222
    Inside Timer Task1455469518222
    Inside Timer Task1455469519222
    Inside Timer Task1455469520222
    Inside Timer Task1455469521222
    Inside Timer Task1455469522222
    Inside Timer Task1455469523222
    Inside Timer Task1455469524222
    Inside Timer Task1455469525222
    Inside Timer Task1455469526222
    Inside Timer Task1455469527222
    Inside Timer Task1455469528223
    Inside Timer Task1455469529223 and it goes on
    

    ANALYSIS : The call to timer.schedule(task, 10000,1000) is going to schedule the task which is going to execute for first time (on another thread) after 10 second from this call. After that it will call again after delay of 10 seconds. It is important to mention here that if the task cannot be started after 10 seconds, next task call will not get pre-pond. So here the delay time between two consecutive task is fixed.

    Source: Java Timer Example

    0 讨论(0)
提交回复
热议问题