2014-07-09 8 views
66

scheduleAtFixedRate और scheduleWithFixedDelayScheduledExecutorService के तरीकों के बीच मुख्य अंतर क्या है?शेड्यूलएटफ़िक्स्ड रेट बनाम अनुसूची WithFixedDelay

scheduler.scheduleAtFixedRate(new Runnable() { 
    @Override 
    public void run() { 
     System.out.println("scheduleAtFixedRate: " + new Date()); 
    } 
}, 1, 3L , SECONDS); 

scheduler.scheduleWithFixedDelay(new Runnable() { 
    @Override 
    public void run() { 
     System.out.println("scheduleWithFixedDelay: " + new Date()); 
    } 
}, 1, 3L , SECONDS); 

वे एक ही समय में सटीक प्रिंट करते हैं, ऐसा लगता है कि वे एक ही अंतराल पर निष्पादित होते हैं।

उत्तर

120

अपने run() विधि के भीतर एक Thread.sleep(1000); कॉल जोड़ने ... मूल रूप से यह के आधार पर समय-निर्धारण कुछ के बीच का अंतर है जब पिछले निष्पादन समाप्त होता है और जब यह (तार्किक) शुरू होता है की कोशिश करें।

उदाहरण के लिए, मैं एक अलार्म अनुसूची एक बार एक घंटे की एक निश्चित दर साथ बंद होने के लिए, और हर बार यह बंद हो जाता है, मैं एक कप कॉफी, जो 10 मिनट लगते हैं की है। मान लीजिए कि आधी रात को शुरू होता है, मैं होगा:

00:00: Start making coffee 
00:10: Finish making coffee 
01:00: Start making coffee 
01:10: Finish making coffee 
02:00: Start making coffee 
02:10: Finish making coffee 

अगर मैं एक निश्चित देरी एक घंटे के साथ अनुसूची, मैं होगा:

00:00: Start making coffee 
00:10: Finish making coffee 
01:10: Start making coffee 
01:20: Finish making coffee 
02:20: Start making coffee 
02:30: Finish making coffee 

आप कौन सा चाहते अपने पर निर्भर करता है कार्य।

+9

क्या fixedRate परिदृश्य में क्या होता है मदद कर सकता है अगर यह अधिक लेता है कॉफी बनाने के लिए एक घंटे से अधिक? –

+3

@ ब्रेटवेंडरविन: मेरा मानना ​​है कि प्रश्न में निष्पादक पर निर्भर करता है। यह * समय पर निर्धारित * होगा - लेकिन क्या * निष्पादित * इस निष्पादक पर धागा उपलब्ध है या नहीं, इस पर निर्भर करता है। मेरा सुझाव है कि आप यह देखने के लिए प्रयोग करें कि यह विभिन्न परिदृश्यों में कैसे काम करता है। –

+3

@ ब्रेटवेंडरविन [दस्तावेज़ीकरण] से [https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate-java.lang.Runnable-long-long-java .util.concurrent.TimeUnit-), "यदि इस कार्य का कोई निष्पादन इसकी अवधि से अधिक समय लेता है, तो बाद के निष्पादन देर से शुरू हो सकते हैं, लेकिन समवर्ती रूप से निष्पादित नहीं होंगे।" दूसरे शब्दों में, एक अनुरूप कार्यान्वयन अगले एक को समाप्त होने तक अगले व्यक्ति को निष्पादित करने की अनुमति नहीं देगा। –

-1

आप जावा डॉक्टर पढ़ें यह स्पष्ट हो जाएगा

ScheduledFuture scheduleAtFixedRate (Runnable आदेश, लंबे initialDelay, लंबी अवधि, TIMEUNIT इकाई) बनाता है और समय-समय पर कार्रवाई है कि पहले सक्षम हो जाता है के बाद दिया प्रारंभिक कार्यान्वित देरी, और बाद में दी गई अवधि के साथ; यह निष्पादन प्रारंभिक डेले के बाद शुरू होगा, प्रारंभिक डेले + अवधि, फिर प्रारंभिक डेले + 2 * अवधि, और इसी तरह।

ScheduledFuture scheduleWithFixedDelay (Runnable आदेश, लंबे initialDelay, लंबे समय से देरी, TIMEUNIT इकाई) बनाता है और समय-समय पर कार्रवाई है जो दिए गए प्रारंभिक विलंब के बाद पहले सक्षम हो जाता है निष्पादित करता है, और बाद में एक निष्पादन की समाप्ति के बीच दिए गए देरी से और अगले के शुरूआत।

0

शेड्यूल में एक पकड़ है अगर पहले धागा बहुत लंबा समय ले रहा है और दी गई अवधि में समाप्त नहीं हुआ है तो दूसरा कंसकटिव थ्रेड शुरू नहीं होगा जब पहला कार्य खत्म हो जाएगा और पहली बार थ्रेड शुरू हो जाएगा, कार्य और gievn अवधि समाप्त हो गया है। जेवीएम तय करेगा कि अगला कार्य कब निष्पादित होगा।

मुझे लगता है कि इस की वजह से मैं बड़ी समस्या मंगलाचरण scheduleAtFixedRate विधि के

+1

क्या? जेवीएम तय करेगा? इसका मतलब क्या है? यह सच है कि रननेबल को दस्तावेज़ों के अनुसार स्वयं के साथ निष्पादित नहीं किया जाएगा, लेकिन यह निर्णयकर्ता द्वारा तय किया जाता है, जो कस्टम हो सकता है या मानक 'अनुसूचित थ्रेडपूलएक्सएटर' (और बाद में अच्छी तरह से परिभाषित व्यवहार है) – Ordous

+0

नहीं मुझे एक ही समस्या मिली है मेरे आवेदन में जहां मैंने 15 मिनट अंतराल दिया है और पहला कार्य 15 मिनट में समाप्त नहीं हो रहा है और 15.30 सेकेंड लेता है, इसलिए दूसरा कार्य तुरंत शुरू नहीं हुआ, कुछ मिनट बाद 5 मिनट के बाद शुरू हो गया और 8 मिनट के बाद कुछ समय और मैं नहीं हूं जानते हैं कि क्या हम इस व्यवहार को नियंत्रित कर सकते हैं क्योंकि यह मानक व्यवहार नहीं है। – user1047873

+0

यह पाठ्यपुस्तक कार्य कतार की तरह लगता है। – Ordous

31

कल्पना समय श्रृंखला मिला विधि क्योंकि चयन करने के लिए आप में मदद मिलेगी। अंतिम निष्पादन तुरंत शुरू हो जाएंगे यदि अंतिम अवधि अवधि से अधिक समय लेता है। अन्यथा, यह अवधि के बाद शुरू होगा। मंगलाचरण scheduleWithFixedDelay विधि के

time series of invocation scheduleAtFixedRate method

समय श्रृंखला।अगला निष्पादन एक निष्पादन की समाप्ति और अगले के प्रारंभ के बीच देरी समय के बाद शुरू होगा, इसके निष्पादन समय की परवाह किए बिना

time series of invocation scheduleWithFixedDelay method

आशा आप

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