जावा में एक आवधिक कार्य कैसे शेड्यूल करें?


183

मुझे समय के निश्चित अंतराल पर चलने के लिए एक कार्य को निर्धारित करने की आवश्यकता है। मैं इसे लंबे अंतराल (प्रत्येक 8 घंटे पर उदाहरण के लिए) के समर्थन से कैसे कर सकता हूं?

मैं वर्तमान में उपयोग कर रहा हूं java.util.Timer.scheduleAtFixedRatejava.util.Timer.scheduleAtFixedRateलंबे समय के अंतराल का समर्थन करता है ?

जवाबों:


260

अनुसूचित शेड्यूलर सेवा का उपयोग करें :

 private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
 scheduler.scheduleAtFixedRate(yourRunnable, 8, 8, TimeUnit.HOURS);

1
यदि आप चाहते हैं कि यह हर दिन एक विशेष समय पर चले तो ऐसा करने का एक बढ़िया तरीका नहीं है, क्योंकि यह TimeUnitदोनों initialDelayऔर पर लागू होता है period। हर 24 घंटे में चल रहा है खत्म हो जाएगा उतार फेंका गया जा रहा है जब, लेकिन एक में डीएसटी किक TimeUnitकी DAYSआप एक ठीक-कणों का निर्दिष्ट नहीं करता है initialDelay। (मुझे लगता है कि आंतरिक शेड्यूल्ड DAYSएक्सिकॉरसर्विस कार्यान्वयन वैसे भी नैनोसेकंडों में परिवर्तित होता है)।
सैम बार्नम

46

आपको क्वार्ट्ज पर एक नज़र रखना चाहिए यह एक जावा फ्रेमवर्क है जो ईई और एसई संस्करणों के साथ काम करता है और एक विशिष्ट समय को निष्पादित करने के लिए नौकरियों को परिभाषित करने की अनुमति देता है।


23

इस तरह आजमाएं ->

सबसे पहले एक क्लास टाइमटेस्क बनाएं जो आपके कार्य को चलाता है, ऐसा दिखता है:

public class CustomTask extends TimerTask  {

   public CustomTask(){

     //Constructor

   }

   public void run() {
       try {

         // Your task process

       } catch (Exception ex) {
           System.out.println("error running thread " + ex.getMessage());
       }
    }
}

तब मुख्य वर्ग में आप कार्य को तत्काल करते हैं और इसे निर्धारित तिथि तक समय-समय पर शुरू करते हैं:

 public void runTask() {

        Calendar calendar = Calendar.getInstance();
        calendar.set(
           Calendar.DAY_OF_WEEK,
           Calendar.MONDAY
        );
        calendar.set(Calendar.HOUR_OF_DAY, 15);
        calendar.set(Calendar.MINUTE, 40);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);



        Timer time = new Timer(); // Instantiate Timer Object

        // Start running the task on Monday at 15:40:00, period is set to 8 hours
        // if you want to run the task immediately, set the 2nd parameter to 0
        time.schedule(new CustomTask(), calendar.getTime(), TimeUnit.HOURS.toMillis(8));
}

6
कोड को अधिक पठनीय बनाने के लिए आप समय सारणी में अंतिम तर्क को बदल सकते हैं TimeUnit.HOURS.toMillis (8)
darrenmc

टाइमर के लिए प्रलेखन इसके बजाय एक्ज़ीक्यूटर फ्रेमवर्क का उपयोग करने की सलाह देता है।
करण खन्ना

14

AbstractScheduledServiceनीचे दिए गए अनुसार Google अमरूद का उपयोग करें :

public class ScheduledExecutor extends AbstractScheduledService
{
   @Override
   protected void runOneIteration() throws Exception
   {
      System.out.println("Executing....");
   }

   @Override
   protected Scheduler scheduler()
   {
        return Scheduler.newFixedRateSchedule(0, 3, TimeUnit.SECONDS);
   }

   @Override
   protected void startUp()
   {
       System.out.println("StartUp Activity....");
   }


   @Override
   protected void shutDown()
   {
       System.out.println("Shutdown Activity...");
   }

   public static void main(String[] args) throws InterruptedException
   {
       ScheduledExecutor se = new ScheduledExecutor();
       se.startAsync();
       Thread.sleep(15000);
       se.stopAsync();
   }

}

यदि आपके पास इस तरह की अधिक सेवाएँ हैं, तो ServiceManager में सभी सेवाओं को पंजीकृत करना अच्छा होगा क्योंकि सभी सेवाएँ एक साथ शुरू और बंद की जा सकती हैं। ServiceManager पर अधिक जानकारी के लिए यहां पढ़ें ।


9

यदि आप साथ रहना चाहते हैं java.util.Timer, तो आप इसे बड़े समय अंतराल पर शेड्यूल करने के लिए उपयोग कर सकते हैं। आप बस उस अवधि में गुजरते हैं, जिसकी आप शूटिंग कर रहे हैं। यहां प्रलेखन की जाँच करें


5

ये दोनों कक्षाएं एक साथ समय-समय पर कार्य करने के लिए काम कर सकती हैं:

निर्धारित कार्य

import java.util.TimerTask;
import java.util.Date;

// Create a class extending TimerTask
public class ScheduledTask extends TimerTask {
    Date now; 
    public void run() {
        // Write code here that you want to execute periodically.
        now = new Date();                      // initialize date
        System.out.println("Time is :" + now); // Display current time
    }
}

अनुसूचित कार्य चलाएँ

import java.util.Timer;

public class SchedulerMain {
    public static void main(String args[]) throws InterruptedException {
        Timer time = new Timer();               // Instantiate Timer Object
        ScheduledTask st = new ScheduledTask(); // Instantiate SheduledTask class
        time.schedule(st, 0, 1000);             // Create task repeating every 1 sec
        //for demo only.
        for (int i = 0; i <= 5; i++) {
            System.out.println("Execution in Main Thread...." + i);
            Thread.sleep(2000);
            if (i == 5) {
                System.out.println("Application Terminates");
                System.exit(0);
            }
        }
    }
}

संदर्भ https://www.mkyong.com/java/how-to-run-a-task-periodically-in-java/


अब तक का सबसे अच्छा समाधान, अधिक स्वच्छ और लागू करने में आसान
सल्वाडोर विगो

4

यदि आपका एप्लिकेशन पहले से ही स्प्रिंग फ्रेमवर्क का उपयोग कर रहा है, तो आपके पास शेड्यूलिंग अंतर्निहित है


4

हर एक सेकंड में कुछ करो

Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        //code
    }
}, 0, 1000);

1
टाइमर के लिए प्रलेखन इसके बजाय एक्ज़ीक्यूटर फ्रेमवर्क का उपयोग करने की सलाह देता है
करण खन्ना

3

मैं स्प्रिंग फ्रेमवर्क की सुविधा का उपयोग करता हूं। ( वसंत-संदर्भ जार या मावेन निर्भरता)।

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;


@Component
public class ScheduledTaskRunner {

    @Autowired
    @Qualifier("TempFilesCleanerExecution")
    private ScheduledTask tempDataCleanerExecution;

    @Scheduled(fixedDelay = TempFilesCleanerExecution.INTERVAL_TO_RUN_TMP_CLEAN_MS /* 1000 */)
    public void performCleanTempData() {
        tempDataCleanerExecution.execute();
    }

}

ScheduledTask अपने कस्टम विधि के साथ अपने ही स्वरूप है पर अमल , जो मैं अपने निर्धारित कार्य के रूप में कहते हैं।


2

क्या आपने एनोटेशन का उपयोग करके स्प्रिंग शेड्यूलर की कोशिश की है ?

@Scheduled(cron = "0 0 0/8 ? * * *")
public void scheduledMethodNoReturnValue(){
    //body can be another method call which returns some value.
}

आप इसे xml के साथ भी कर सकते हैं।

 <task:scheduled-tasks>
   <task:scheduled ref = "reference" method = "methodName" cron = "<cron expression here> -or- ${<cron expression from property files>}"
 <task:scheduled-tasks>

0

मेरे सर्वलेट में एक कोड के रूप में यह होता है कि यदि कोई उपयोगकर्ता स्वीकार करता है तो इसे अनुसूचक में कैसे रखा जाए

if(bt.equals("accept")) {
    ScheduledExecutorService scheduler=Executors.newScheduledThreadPool(1);
    String lat=request.getParameter("latlocation");
    String lng=request.getParameter("lnglocation");
    requestingclass.updatelocation(lat,lng);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.