2010-11-17 18 views
11

रोकना शुरू कर रहा है मैं ScheduledExecutorService का उपयोग कर रहा हूं, और इसके बाद मैं इसे shutdown विधि कहता हूं, मैं उस पर एक रननेबल शेड्यूल नहीं कर सकता। scheduleAtFixedRate(runnable, INITIAL_DELAY, INTERVAL, TimeUnit.SECONDS) पर कॉल करने के बाद shutdown() java.util.concurrent फेंकता है। अस्वीकृत निष्पादन अपवाद। shutdown() के बाद ScheduledExecutorService पर एक नया कार्य चलाने का कोई और तरीका है?अनुसूचितExecutorService कई बार

+1

यह व्यवहार की उम्मीद है। क्या आप समझा सकते हैं कि आप क्या करने का प्रयास कर रहे हैं और आप शटडाउन के बाद एक और रननेबल क्यों निष्पादित करना चाहते हैं? – Jeremy

उत्तर

35

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

//get reference to the future 
Future<?> future = service.scheduleAtFixedRate(runnable, INITIAL_DELAY, INTERVAL, TimeUnit.SECONDS) 
//cancel instead of shutdown 
future.cancel(true); 
//schedule again (reuse) 
future = service.scheduleAtFixedRate(runnable, INITIAL_DELAY, INTERVAL, TimeUnit.SECONDS) 
//shutdown when you don't need to reuse the service anymore 
service.shutdown() 
+1

मैं वसंत पर्यावरण में नई सेवाओं को बंद करने और बनाने में सक्षम था, लेकिन ईजेबी मुझे दुःख दे रहे थे। यह चाल है, धन्यवाद! –

+0

@Alex पहली भविष्य की वस्तु तब तक रिलीज़ नहीं होगी जब तक कि सेवा बंद न हो जाए। जब सेवा लंबे समय तक रहती है, और कई बार शेड्यूल होती है तो यह एक स्मृति रिसाव होगी। यदि सही है, तो स्मृति लीकिंग से बचने का कोई तरीका है? – Nickolas

+0

मैं गलत हूं, रद्द किया गया भविष्य कार्य कार्य में जोड़ा नहीं जाएगा Queue, इसलिए इसे जीसी द्वारा जारी किया जाएगा। – Nickolas

5

shutdown() की javadocs कहते हैं:

Initiates an orderly shutdown in which previously submitted tasks are executed, 
but no new tasks will be accepted. 

तो, आप shutdow() फोन नहीं कर सकते हैं और उसके बाद नए कार्य शेड्यूल करें।

+0

शट डाउन के बाद नए कार्यों को फिर से शेड्यूल करने के बारे में कोई सुझाव? – walters

+0

या तो एक नया अनुसूचितExecutorService बनाएं या मौजूदा को बंद न करें। क्या कोई कारण है कि आप इसे बंद कर रहे हैं? –

2

आप इसे बंद करने के बाद अपने निष्पादक को नए कार्यों को स्वीकार नहीं कर सकते हैं। अधिक प्रासंगिक सवाल यह है कि आपको इसे पहले स्थान पर बंद करने की आवश्यकता क्यों है? आपके द्वारा बनाए गए निष्पादक को आपके आवेदन या उप-प्रणाली के पूरे जीवनकाल में फिर से उपयोग किया जाना चाहिए।

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