जावा टाइमर बनाम एक्सेकॉर्स सर्विस?


263

मेरे पास कोड है जहां मैं एक कार्य का उपयोग करके शेड्यूल करता हूं java.util.Timer। मैं चारों ओर देख रहा था और देखा कि मैं ExecutorServiceभी ऐसा कर सकता हूं। तो यह सवाल यहाँ, क्या आपने उपयोग किया है Timerऔर ExecutorServiceकार्यों को शेड्यूल करने के लिए, एक का दूसरे पर उपयोग करने से क्या लाभ है?

यह भी जांचना चाहता था कि क्या किसी ने Timerकक्षा का उपयोग किया था और किसी भी मुद्दे पर भाग गया था जो ExecutorServiceउनके लिए हल हो गया था।


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

जवाबों:


313

अभ्यास में जावा कंसीडर के अनुसार :

  • Timerसिस्टम घड़ी में परिवर्तन के प्रति संवेदनशील हो सकता है, ScheduledThreadPoolExecutorनहीं।
  • Timerकेवल एक निष्पादन धागा है, इसलिए लंबे समय तक चलने वाला कार्य अन्य कार्यों में देरी कर सकता है। ScheduledThreadPoolExecutorकिसी भी थ्रेड के साथ कॉन्फ़िगर किया जा सकता है। इसके अलावा, यदि आप चाहते हैं (प्रदान करके ThreadFactory) , तो आपके पास निर्मित थ्रेड पर पूर्ण नियंत्रण है ।
  • रनटाइम अपवादों TimerTaskको उस थ्रेड में फेंक दिया जाता है , इस प्रकार Timerमृत बना दिया जाता है :-( ... यानी निर्धारित कार्य अब नहीं चलेंगे। ScheduledThreadExecutorन केवल रनटाइम अपवादों को पकड़ता है, बल्कि यह आपको उन्हें संभालने की सुविधा देता है यदि आप चाहते हैं ( afterExecuteविधि से ओवरराइड करके ThreadPoolExecutor)। फेंक अपवाद को रद्द कर दिया जाएगा, लेकिन अन्य कार्य चलते रहेंगे।

यदि आप ScheduledThreadExecutorइसके बजाय उपयोग कर सकते हैं Timer, तो ऐसा करें।

एक और बात ... जबकि ScheduledThreadExecutorजावा 1.4 लाइब्रेरी में उपलब्ध नहीं है, वहाँ JSR 166 ( java.util.concurrent) से जावा 1.2, 1.3, 1.4 का बैकपोर्ट है , जिसमें ScheduledThreadExecutorक्लास है।


63

यदि यह आपके लिए उपलब्ध है, तो जावा 5 के निष्पादक ढांचे का उपयोग करने के कारण के बारे में सोचना मुश्किल है । कॉलिंग:

ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();

आपको ScheduledExecutorServiceइसी तरह की कार्यक्षमता के साथ Timerदेगा (यानी यह एकल-थ्रेडेड होगा) लेकिन जिसकी पहुंच थोड़ी अधिक मापनीय हो सकती है (हुड के तहत, यह Timerवर्ग के साथ पूर्ण तुल्यकालन के बजाय समवर्ती संरचनाओं का उपयोग करता है )। एक का उपयोग करने से ScheduledExecutorServiceआपको लाभ मिलता है जैसे:

  • जरूरत पड़ने पर आप इसे कस्टमाइज कर सकते हैं ( newScheduledThreadPoolExecutor()या ScheduledThreadPoolExecutorकक्षा को देखें)
  • 'एक बंद' निष्पादन परिणाम वापस कर सकता है

Timerमेरे विचार से चिपके रहने के एकमात्र कारणों के बारे में हैं:

  • यह प्री जावा 5 उपलब्ध है
  • J2ME में एक समान वर्ग प्रदान किया गया है, जो आपके आवेदन को पोर्ट करना आसान बना सकता है (लेकिन इस मामले में अमूर्तता की एक आम परत जोड़ना बहुत मुश्किल नहीं होगा)

1
उपयोग करने का एक और कारण TimerTaskहो सकता है कि scheduledExecutionTime()विधि की उपलब्धता, जो किसी भी समकक्ष के बराबर न हो ScheduledExecutorService
रोहित अग्रवाल

3
एक और नोट: मैं यह टिप्पणी 2k17 में लिख रहा हूं, इसमें J2ME नहीं है। यह पहले ही मर चुका है।
14

1
जावा टाइमर-क्लास भद्दा है।
जॉनीटेक्स

26

ExecutorService नई और अधिक सामान्य है। एक टाइमर सिर्फ एक धागा है जो समय-समय पर आपके द्वारा निर्धारित सामान को चलाता है।

एक ExecutorService एक थ्रेड पूल हो सकता है, या यहां तक ​​कि एक क्लस्टर में अन्य प्रणालियों में फैल सकता है और एक-बैच बैच निष्पादन, आदि जैसी चीजें कर सकता है ...

बस यह देखें कि प्रत्येक प्रस्ताव को क्या तय करना है।


16

यहां टाइमर के उपयोग के बारे में कुछ और अच्छे अभ्यास दिए गए हैं:

http://tech.puredanger.com/2008/09/22/timer-rules/

सामान्य तौर पर, मैं अधिक मजबूत उपयोग के लिए त्वरित और गंदे सामान और एक्जिक्यूटर के लिए टाइमर का उपयोग करता हूं।


8

शेड्यूल किए गए Oracle पेज से ScheduledThreadPoolExecutor पर

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

ExecutorService/ThreadPoolExecutorया ScheduledThreadPoolExecutorजब आपके पास कई कार्यकर्ता सूत्र हैं, तो स्पष्ट पसंद है।

के पेशेवरों ExecutorServiceसे अधिकTimer

  1. TimerForkJoinPool जैसे ExecutorServiceफ्लेवर का उपयोग करके कई कार्यों के साथ विशेष रूप से उपलब्ध सीपीयू कोर का लाभ नहीं उठा सकते हैं ExecutorService
  2. ExecutorServiceयदि आपको कई कार्यों के बीच समन्वय की आवश्यकता है, तो सहयोगी API प्रदान करता है। मान लें कि आपको श्रमिक संख्या के एन नंबर जमा करने हैं और उन सभी के पूरा होने का इंतजार करना है। आप इसे invokeAll API से आसानी से हासिल कर सकते हैं । यदि आप एक से अधिक Timerकार्यों को प्राप्त करना चाहते हैं, तो यह सरल नहीं होगा।
  3. ThreadPoolExecutor थ्रेड जीवन चक्र के प्रबंधन के लिए बेहतर API प्रदान करता है।

    थ्रेड पूल दो अलग-अलग समस्याओं का समाधान करते हैं: आमतौर पर प्रति-कार्य आमंत्रण ओवरहेड कम होने के कारण बड़ी संख्या में अतुल्यकालिक कार्यों को निष्पादित करते समय वे बेहतर प्रदर्शन प्रदान करते हैं, और वे थ्रेड सहित उपभोग किए गए संसाधनों को बाध्य करने और प्रबंधित करने का एक साधन प्रदान करते हैं, जब एक संग्रह का संग्रह किया जाता है। कार्य। प्रत्येक ThreadPoolExecutor कुछ बुनियादी आँकड़े भी रखता है, जैसे कि पूर्ण किए गए कार्यों की संख्या

    कुछ फायदे:

    ए। आप थ्रेड्स के जीवन चक्र को बना / प्रबंधित / नियंत्रित कर सकते हैं और थ्रेड निर्माण लागत ओवरहेड का अनुकूलन कर सकते हैं

    ख। आप कार्यों के प्रसंस्करण (वर्क चोरी, फोर्कजॉइनपूल, इनवोकॉल) आदि को नियंत्रित कर सकते हैं।

    सी। आप थ्रेड्स की प्रगति और स्वास्थ्य की निगरानी कर सकते हैं

    घ। बेहतर अपवाद संचालन तंत्र प्रदान करता है


5

कभी-कभी Executors.newSingleThreadScheduledExecutor () पर टाइमर पसंद करने का मेरा कारण यह है कि मुझे बहुत क्लीनर कोड मिलता है जब मुझे डेमन थ्रेड्स पर निष्पादित करने के लिए टाइमर की आवश्यकता होती है।

तुलना

private final ThreadFactory threadFactory = new ThreadFactory() {
    public Thread newThread(Runnable r) {
        Thread t = new Thread(r);
        t.setDaemon(true);
        return t;
    }
};
private final ScheduledExecutorService timer = Executors.newSingleThreadScheduledExecutor(threadFactory); 

साथ में

private final Timer timer = new Timer(true);

मैं ऐसा तब करता हूं जब मुझे निष्पादक की मजबूती की आवश्यकता नहीं होती है।

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