अनुसूचि


117

के बीच मुख्य अंतर क्या है scheduleAtFixedRateऔर scheduleWithFixedDelayके तरीकों ScheduledExecutorService ?

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);

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

जवाबों:


206

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

उदाहरण के लिए, मान लें कि मैं एक घंटे की निश्चित दर के साथ एक अलार्म बंद करने के लिए शेड्यूल करता हूं , और हर बार जब यह बंद होता है, तो मेरे पास एक कप कॉफी होती है, जिसमें 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

आप जो चाहते हैं वह आपके कार्य पर निर्भर करता है।


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

5
@BrettVanderVeen: मेरा मानना ​​है कि प्रश्न में निष्पादक पर निर्भर करता है। यह हो जाएगा अनुसूचित समय पर - लेकिन चाहे वह कार्यान्वित किया जाए या नहीं एक धागा है कि प्रबंधक के लिए उपलब्ध है पर निर्भर करता है। मेरा सुझाव है कि आप यह देखने के लिए प्रयोग करें कि यह विभिन्न परिदृश्यों में कैसे काम करता है।
जॉन स्कीट

8
@BrettVanderVeen प्रलेखन से , "यदि इस कार्य के किसी भी निष्पादन को इसकी अवधि से अधिक समय लगता है, तो बाद के निष्पादन देर से शुरू हो सकते हैं, लेकिन समवर्ती रूप से निष्पादित नहीं होंगे।" दूसरे शब्दों में, एक अनुरूप कार्यान्वयन अगले एक को तब तक निष्पादित करने की अनुमति नहीं देगा जब तक कि पिछले एक खत्म न हो जाए।
एम। जस्टिन

क्या आप मेरे जैसे नौसिखिए के लिए दिखाए गए (कॉफी) आउटपुट के लिए एक कार्य कोड प्रदान कर सकते हैं?
मुनेशसिंह

@ मुनेश सिंह: इस सवाल में नहीं, जो यह बताने के लिए कह रहा है कि एक निश्चित दर पर शेड्यूल करने और एक निश्चित देरी पर शेड्यूल करने के बीच क्या अंतर है। आप इसे स्वयं वैसे भी लागू नहीं करेंगे - आप अंतर्निहित निष्पादकों का उपयोग करेंगे।
जॉन स्कीट

57

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

आह्वान अनुसूची की समय श्रृंखला

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

समय सारणी आह्वान की अनुसूची

आशा है कि आप मदद कर सकते हैं


मैं "अतिरिक्त" अनुसूची में उल्लिखित शब्द को समझ नहीं पाया।
मुनेशसिंह

1
@MuneshSingh यह दिखाने के लिए है कि कार्य का निष्पादन समय निर्धारित से अधिक लंबा है, इसलिए इसे "अतिरिक्त" समय लगता है और अगला निष्पादन तुरंत शुरू होता है।
वैरेल

@Viorel स्पष्ट करने के लिए धन्यवाद। क्या इसका मतलब है कि "अवधि" लगातार दो निष्पादन के बीच एक निश्चित समय देरी नहीं है।
मुनेशसिंह

1
@ मुनेशसिंह की अवधि तय हो गई है, लेकिन इसे पास करने के बाद यह वर्तमान कार्य को बंद नहीं करेगा, बस इस रन और अगले के बीच कोई देरी नहीं होगी। यदि आप एक "टाइमआउट" बनाना चाहते हैं, तो आप फ्यूचर को बरकरार रखना चाहते हैं और इसे एक अलग निष्पादक में रद्द कर सकते हैं। सरल शब्दों में, यह कहता है कि "अवधि" समय बीतने के बाद पहले निष्पादन और अगले एक को जितनी जल्दी हो सके शुरू करें
वैरेल

4

scheduleAtFixedRate()विधि एक नया कार्य और इसके द्वारा सबमिट की निष्पादक के लिए हर अवधि, बनाता है या नहीं, पिछले कार्य समाप्त हो गया की परवाह किए बिना

दूसरी ओर, scheduleWithFixedDelay()विधि पिछले कार्य के समाप्त होने के बाद एक नया कार्य बनाती है ।


आपने दो बार लिखा है scheduleAtFixedRate:)
व्लाद

3

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

शेड्यूल्ड फ़ॉइल शेड्यूलAtFixedRate (Runnable command, long initialDelay, long period, TimeUnit यूनिट) एक आवधिक क्रिया को निष्पादित और निष्पादित करता है जो दी गई शुरुआती देरी के बाद पहले सक्षम हो जाती है, और बाद में दी गई अवधि के साथ; कि निष्पादन आरंभिक अवधि के बाद शुरू हो जाएगा, फिर आरंभिक अवधि + अवधि, फिर आरंभिक + 2 * अवधि, और इसी तरह।

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


1

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

मुझे लगता है कि इससे आपको मेथड ब्यूसेज़ चुनने में मदद मिलेगी, क्योंकि मुझे बड़ी समस्या है


1
क्या? जेवीएम तय करेगा? इसका क्या मतलब है? यह सच है कि रन करने योग्य डॉक्स के अनुसार अपने आप को समवर्ती रूप से निष्पादित नहीं किया जाएगा, लेकिन यह निष्पादक द्वारा तय किया गया है, जो कस्टम या मानक हो सकता है ScheduledThreadPoolExecutor(और बाद में अच्छी तरह से परिभाषित व्यवहार है)
ऑर्डस

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

ऐसा लगता है कि पाठ्यपुस्तक कार्य पंक्तिबद्ध है।
साधारण

हां, इसका मतलब यह है कि आपके निष्पादक के सभी सूत्र पहले से ही कुछ करने में व्यस्त हैं, और आपका कार्य करने के लिए चीजों की कतार में लग जाता है। ( ध्यान दें कि आपको इस बात की पुष्टि करने की आवश्यकता है कि या तो कतारों को देखकर या यह देखने के लिए कि निष्पादक थ्रेड्स क्या कर रहे हैं)। आप इसे कैसे नियंत्रित करते हैं यह इस बात पर निर्भर करता है कि आपके पास किस प्रकार का निष्पादक है। आप केवल इस विशेष कार्य के लिए एक अलग थ्रेड-थ्रू निष्पादक बनाना चाहते हैं, फिर यह किसी भी चीज़ पर प्रतीक्षा नहीं करेगा। या अपने वर्तमान निष्पादक को अधिक सूत्र दें। या इसे बदलो रणनीति है।
आयुध

0

चलो एक सरल कार्यक्रम लिखते हैं:

import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit

var time = 0L
var start = System.currentTimeMillis()
val executor = Executors.newScheduledThreadPool(1)
executor.scheduleWithFixedDelay({
    if (time >= 12_000L) {
        executor.shutdown()
    } else {
        Thread.sleep(2000L)
        val now = System.currentTimeMillis()
        time += now - start
        System.out.println("Total $time delay ${now - start}\n")
        start = now
    }
}, 0L, 1000L, TimeUnit.MILLISECONDS)

और परिणाम देखें:

| scheduleWithFixedDelay |   scheduleAtFixedRate  |
|:----------------------:|:----------------------:|
| Total 2001 delay 2001  | Total 2003 delay 2003  |
| Total 5002 delay 3001  | Total 4004 delay 2001  |
| Total 8003 delay 3001  | Total 6004 delay 2000  |
| Total 11003 delay 3000 | Total 8004 delay 2000  |
| Total 14003 delay 3000 | Total 10005 delay 2001 |
|          ---           | Total 12005 delay 2000 |

सूचना निष्पादन समय प्रतीक्षा से बड़ा है

scheduleWithFixedDelay देरी रहता
scheduleAtFixedRate हटा देगा देरी


-1
scheduledExecutorService.scheduleAtFixedRate(() -> {
        System.out.println("runnable start"); try { Thread.sleep(5000);  System.out.println("runnable end");} catch
     (InterruptedException e) { // TODO Auto-generated catch block
      e.printStackTrace(); }}, 2, 7, TimeUnit.SECONDS);



     scheduledExecutorService.scheduleWithFixedDelay(() -> {
     System.out.println("runnable start"); try { Thread.sleep(5000); System.out.println("runnable end");} catch
     (InterruptedException e) { // TODO Auto-generated catch block
     e.printStackTrace(); } }, 2, 7, TimeUnit.SECONDS);

बस इसे निष्पादित करें, और आपको अंतर पता चल जाएगा। धन्यवाद


1
कृपया यह भी बताएं कि कोड ओपी की समस्या को कैसे हल करता है। :)
यश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.