2009-12-19 18 views
6

बनाता है मेरे पास यह प्रश्न है:जावा: टाइमर और धागा यह

मेरे पास टाइमर है। शेड्यूल के साथ ATFixedRate यह एक नया टाइमर कार्य बनाता है। उस टाइमर कार्य में कुछ कोड होता है, जिसे पूरा करने में कुछ समय लग सकता है। मैं यह कैसे सुनिश्चित कर सकता हूं कि टाइमर नया कार्य नहीं करेगा जब पिछला कोई पूरा नहीं हुआ था?

धन्यवाद

उत्तर

17

मेरा उत्तर Timer का उपयोग नहीं करना है, यह अप्रचलित है। चूंकि Java5, Timer को ScheduledExecutorService से हटा दिया गया है, जो अधिक लचीला और उपयोग करने में आसान है। शेड्यूलर कैसे काम करता है, इस पर आपको बेहतर नियंत्रण मिलता है, जिस तरह से आप Timer के साथ नियंत्रण नहीं करते हैं।

आप Executors फैक्ट्री क्लास का उपयोग करके एक बनाते हैं, जिसमें कई फैक्ट्री विधियां हैं। एक आप पर विचार करना चाहिए newSingleThreadScheduledExecutor है, जो वास्तव में क्या करना चाहिए है क्या आप देख रहे हैं:

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

एक ScheduledExecutorService साथ

, उपवर्गीकरण TimerTask के बजाय, आप Runnable सीधे उपवर्ग, और उसके बाद निष्पादक करने के लिए कार्य सबमिट करें। वहाँ निष्पादक पर विभिन्न तरीके हैं, तो आप लेने के लिए जो एक अपनी आवश्यकताओं के लिए उपयुक्त है (ScheduledExecutorService ध्यान के लिए जावाडोक पढ़ें) की जरूरत है, लेकिन सार कुछ इस तरह है:

// initialise the executor 
    ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); 

    while (tasksRemaining) { 
     // create your task 
     Runnable task = ....; 
     // submit it to the executor, using one of the various scheduleXYZ methods 
     executor.schedule(task, delay, unit); 
    } 

    // when everything is finished, shutdown the executor 
    executor.shutdown(); 

हमेशा की तरह, जावाडोक पढ़ें।

+0

यदि यह अप्रचलित है और प्रतिस्थापित किया गया है, तो इसे @deprecated के रूप में चिह्नित नहीं किया जाना चाहिए? –

+0

मेरी राय में, हाँ, यह चाहिए, लेकिन विलुप्त होने पर सूर्य के नियम थोड़ा रहस्यमय हैं। कार्यात्मक रूप से, 'टाइमर'/'टाइमरटास्क 'निष्पादक ढांचे पर कुछ भी नहीं प्रदान करता है। – skaffman

+0

क्या आप कृपया नए सिंगल थ्रेड शेड्यूल्डएक्सएटर का उपयोग करने का एक छोटा सा उदाहरण दिखा सकते हैं? मैं जावा के लिए नया हूं, और मैंने कभी निष्पादक वर्ग के बारे में नहीं सुना। धन्यवाद – Andrey

3

डॉक Timer class

प्रत्येक टाइमर वस्तु के अनुरूप के लिए एक भी पृष्ठभूमि थ्रेड है टाइमर के कार्यों के सभी निष्पादित करने के लिए, क्रमिक रूप से प्रयोग किया जाता है। टाइमर कार्य जल्दी से पूरा करना चाहिए। यदि टाइमर कार्य को पूरा करने में अत्यधिक समय लगता है, यह टाइमर का कार्य निष्पादन धागा "hogs" करता है। इसके बदले में, बाद के कार्यों के निष्पादन में देरी हो सकती है, जो तेजी से उत्तराधिकार में ("अगर) अपमानजनक कार्य अंततः पूरा हो सकता है तो" गुच्छा "और निष्पादित हो सकता है।

बताता है कि केवल एक पृष्ठभूमि धागा है। तो मेरा मानना ​​है कि यह परिदृश्य नहीं होगा।

+1

नहीं, यह तब भी अतिरिक्त कार्य करेगा जब पुराना अभी तक पूरा नहीं हुआ है, वे पहले तक खत्म होने तक निष्पादित नहीं करेंगे (और वे तुरंत बाद में निष्पादित हो सकते हैं, जो वांछित व्यवहार की संभावना नहीं है) । –

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