2015-12-10 8 views
8

कार्यक्रम नौ प्रिंट के बाद खत्म:शेड्यूल किए गए एक्सप्लोरर सेवा को कैसे रोकें?

class BeeperControl { 

    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 

    public void beep() { 
     final Runnable beeper = new Runnable() { 
      public void run() { 
       System.out.println("beep"); 
      } 
     }; 
     final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(
       beeper, 1, 1, SECONDS); 
     scheduler.schedule(new Runnable() { 
      public void run() { 
       beeperHandle.cancel(true); 
      } 
     }, 1 * 9, SECONDS); 
    } 

    public static void main(String[] args) { 
     BeeperControl bc = new BeeperControl(); 
     bc.beep(); 
    } 
} 

कैसे एक प्रक्रिया (उदाहरण के लिए ग्रहण में अर्थात जावा प्रक्रिया) को रोकने के लिए, क्योंकि यह 9 सेकंड में एक समय सीमा के बाद बंद नहीं करता है?

+0

अच्छा ... आपका मतलब क्या है "यह 9 सेकंड में समय सीमा के बाद नहीं रुकता"? मैंने अभी परीक्षण किया है, और "बीप" 9 सेकंड के बाद बंद होने की उम्मीद है। पूरा कार्यक्रम निश्चित रूप से नहीं रुकता है, क्योंकि आपने थ्रेड पूल को बंद नहीं किया है। यदि - बीपर को रद्द करने के बजाय - आप बस 9 सेकंड के बाद शेड्यूलर को बंद कर देते हैं, तो आपका प्रोग्राम सामान्य रूप से बाहर निकल जाएगा। क्या वह व्यवहार आप चाहते थे? – Seelenvirtuose

उत्तर

11

आपके पास यह मुद्दा यह है कि बीप कार्य रद्द करने के बाद शेड्यूलर लाइव थ्रेड रखता है।

यदि कोई लाइव गैर-डिमन थ्रेड है, तो JVM जीवित रहता है।

कारण यह है कि यह इस सूत्र के आसपास रहता है कि आप इसे बता दिया है इस पंक्ति में ऐसा करने के लिए है:

private final ScheduledExecutorService scheduler 
     = Executors.newScheduledThreadPool(1); 

नोट newScheduledThreadPool(int corePoolSize) के प्रलेखन:

corePoolSize - धागे की संख्या पूल में रखने के लिए, भले ही वे निष्क्रिय हों।

तो, आप समाप्त करने के लिए JVM पैदा करने के लिए दो संभव तरीके होते हैं:

  1. पास 0newScheduledThreadPool बजाय 1. करने के लिए अनुसूचक एक जीवित धागा नहीं रखेंगे, और JVM समाप्त कर देगा।

  2. शेड्यूलर बंद करें। आपको अपने संसाधनों को जारी करने के लिए वैसे भी ऐसा करना है। तो अपने गुमनाम Runnable में run बदलने के लिए:

    public void run() { 
        beeperHandle.cancel(true); 
        scheduler.shutdown(); 
    } 
    

(वास्तव में, आप वहाँ cancel जरूरत नहीं है - shutdown जैसे ही अगले "बीप" पूरा हो गया है प्रभावी होगा।)

+0

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

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