2011-10-18 17 views
117

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

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

उत्तर

165

उपयोग एक ScheduledExecutorService:

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

आप Quartz करने के लिए एक से अवलोकन करना चाहिए यह एक जावा ढांचा जो ईई और एसई संस्करणों के साथ काम करता है और एक विशिष्ट समय पर अमल करने

8

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

20

इस तरह का प्रयास करें ->

सबसे पहले एक वर्ग TimeTask कि अपने कार्य को चलाने के बनाने के लिए, ऐसा लगता है कि:

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)); 
} 
+5

कोड को और अधिक पठनीय बनाने के लिए आप टाइमयूनीट को कॉल शेड्यूल में अंतिम तर्क बदल सकते हैं। HOURS.toMillis (8) – darrenmc

8

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

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 पर और अधिक के लिए here पढ़ें।

+0

गुवा अब गिटहब पर है। यहां नए [ServiceManager] (https://github.com/google/guava/wiki/ServiceExplained) दस्तावेज़ का एक लिंक दिया गया है। – Renato

1

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

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निष्पादित, जो मैं अपने निर्धारित कार्य के रूप में फोन मेरे कस्टम विधि के साथ अपने ही स्वरूप है।

संबंधित मुद्दे