2010-02-16 5 views
9

मेरे पास एक निर्धारित कार्य है (निश्चित देरी निष्पादन में चल रहा है), इस तरह से शुरू किया गया:ScheduledExecutorService शेड्यूल किए गए कार्य को पुनरारंभ करने का सही तरीका क्या है?

executoreService.scheduleWithFixedDelay(repeatingThread, 0, numOfSeconds, TimeUnit.SECONDS); 

चक्र की हर शुरुआत पर, मैं सेटिंग्स फ़ाइल में बदलाव की जांच करता हूं, और फिर मैं कार्य को पुनरारंभ करना चाहता हूं। सेटिंग्स फ़ाइल में अंतराल की लंबाई भी होती है (उपरोक्त कोड में numOfSeconds)।

वर्तमान में, मैं कार्य को पुनरारंभ करने के लिए निम्न कोड का उपयोग कर रहा हूं:

executoreService.shutdownNow(); 
try { 
while(!executoreService.awaitTermination(5, TimeUnit.SECONDS)){ 
    logger.debug("awaiting termintation"); 
} 
} catch (InterruptedException e) { 
logger.debug("interrupted, continuing", e); 
} 
// initialize startup parameters 
init(); 
// start the main scheduled timer 
executoreService.scheduleWithFixedDelay(repeatingThread, 0, numOfSeconds, TimeUnit.SECONDS); 

मुझे इन API कॉल के बारे में निश्चित नहीं है। कार्य को पुनरारंभ करने के लिए अनुशंसित तरीका क्या है (संभवतः एक नई देरी के साथ)?

उत्तर

13

नहीं, आप एक कार्य को संशोधित करने के लिए पूरी सेवा को बंद या बंद नहीं करना चाहते हैं। कार्य को रद्द करने के लिए सेवा से प्राप्त अनुसूचित भविष्य वस्तु का उपयोग करें और फिर एक नया शेड्यूल करें।

ScheduledFuture<?> future = executorService.scheduleWithFixedDelay(repeatingThread, 0, numOfSeconds, TimeUnit.SECONDS); 
... 
// to cancel it: 
future.cancel(true); 
// then schedule again 

वैकल्पिक रूप से, क्यों नहीं बस में जो कुछ भी repeatingThread नई सेटिंग या मापदंडों के साथ है राज्य को अद्यतन? यदि आपको नई देरी की आवश्यकता नहीं है, तो इसे पुन: निर्धारित करने की भी आवश्यकता नहीं है।

+0

यह विचार करने के लिए कुछ है, लेकिन सेटिंग को बदलने के किसी भी मामले को कवर करने में कुछ आसान करना आसान है। यानी, सेटिंग फ़ाइल में कोई भी परिवर्तन * देरी भी बदल सकता है। तो यह जांचने के बजाय कि देरी बदल दी गई थी और फिर एक काम करें, और यदि यह कुछ और नहीं था, तो मैं किसी भी मामले में बस फिर से शुरू करना चाहता हूं। – Ovesh

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