run a Java program in specific time

2020-02-16 04:33发布

问题:

i need help to run my Java program on the server at a specific time like 2 pm (to index the new files).

Someone told me that Java has some thing called jobs but I don't know how to work with that. I tried this:

 boolean cond=true;
 while(cond){
     @SuppressWarnings("deprecation")
     int heur = new Date().getHours();
     @SuppressWarnings("deprecation")
     int minute= new Date().getMinutes();
     if(heur==16 && minute==02){
         indexer.close();
         end = new Date().getTime();
         File f;
         cond=false;
     }

But with this the program is still running.

How could I run my program at a specified time?

回答1:

Theres a API called Quartz, It's where your program can schedule "Jobs" and it will run it at that time.

Until I can give an example, try this link.

Edit: First you have to create a class that implements org.quartz.Job. When you implement that you will have to implement the method execute(JobExecutionContext jobExecution), which is the method that will run when the "trigger" is fired.

To set up the Schedule:

SchedulerFactory schedulerFactory = new StdSchedulerFactory();
// Retrieve a scheduler from schedule factory
Scheduler scheduler = null;
try {
    scheduler = schedulerFactory.getScheduler();
}
catch (SchedulerException e) {
    e.printStackTrace();
}

//Set up detail about the job 
JobDetail jobDetail = new JobDetail("jobDetail", "jobDetailGroup", ImplementedJob.class);
SimpleTrigger simpleTrigger = new SimpleTrigger("Trigger Name","defaultGroup", DATE);

// schedule a job with JobDetail and Trigger
scheduler.scheduleJob(jobDetail, simpleTrigger);
// start the scheduler
scheduler.start();


回答2:

There's no Thread.sleep() call in the loop, so it will "spin" at 100% CPU (not good), but it's a poor design anyway. A big improvement would be to simply calculate the number of milliseconds between "now" and when you want it to run, then call Thread.sleep(n).

However, a better solution is to use what the JDK already provides.

Have a look at this code which uses classes from the JDK concurrent library. This is a very simple example that would work:

import java.util.concurrent.*;

public static void main(String[] args)
{
    ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
    Runnable runnable = new Runnable() {
        public void run()
        {
            // do something;
        }
    };

    // Run it in 8 hours - you would have to calculate how long to wait from "now"
    service.schedule(runnable, 8, TimeUnit.HOURS); // You can 
}