2010-05-27 18 views
105

मैं यह सुनिश्चित करने की कोशिश कर रहा हूं कि मेरा जावा एप्लिकेशन मजबूत होने के लिए उचित कदम उठाएगा, और उसमें से कुछ हिस्से में शानदार तरीके से बंद करना शामिल है। मैं shutdown hooks पढ़ रहा हूं और मुझे वास्तव में अभ्यास में उनका उपयोग करने का तरीका नहीं मिलता है।जावा में शट डाउन हुक का उपयोगी उदाहरण?

क्या वहां कोई व्यावहारिक उदाहरण है?

मान लीजिए कि मेरे पास नीचे एक ऐसा एक बहुत ही सरल एप्लिकेशन था, जो 100 के बैचों में एक फ़ाइल में संख्याओं को 10 लिखता है, और मैं यह सुनिश्चित करना चाहता हूं कि कार्यक्रम बाधित होने पर दिया गया बैच खत्म हो जाए। मुझे शटडाउन हुक पंजीकृत करने का तरीका मिलता है लेकिन मुझे नहीं पता कि मेरे आवेदन में इसे कैसे एकीकृत किया जाए। कोई सुझाव?

package com.example.test.concurrency; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.PrintWriter; 

public class GracefulShutdownTest1 { 
    final private int N; 
    final private File f; 
    public GracefulShutdownTest1(File f, int N) { this.f=f; this.N = N; } 

    public void run() 
    { 
     PrintWriter pw = null; 
     try { 
      FileOutputStream fos = new FileOutputStream(this.f); 
      pw = new PrintWriter(fos); 
      for (int i = 0; i < N; ++i) 
       writeBatch(pw, i); 
     } 
     catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      pw.close(); 
     }  
    } 

    private void writeBatch(PrintWriter pw, int i) { 
     for (int j = 0; j < 100; ++j) 
     { 
      int k = i*100+j; 
      pw.write(Integer.toString(k)); 
      if ((j+1)%10 == 0) 
       pw.write('\n'); 
      else 
       pw.write(' '); 
     } 
    } 

    static public void main(String[] args) 
    { 
     if (args.length < 2) 
     { 
      System.out.println("args = [file] [N] " 
        +"where file = output filename, N=batch count"); 
     } 
     else 
     { 
      new GracefulShutdownTest1(
        new File(args[0]), 
        Integer.parseInt(args[1]) 
      ).run(); 
     } 
    } 
} 

उत्तर

134

आप निम्न कर सकता है:

  • झूठी
  • (वैकल्पिक रूप से करने के लिए बंद हुक सेट कुछ AtomicBoolean (या अस्थिर बुलियन) "keepRunning" चलो, .interrupt काम कर धागे अगर वे के लिए प्रतीक्षा कुछ अवरुद्ध कॉल में डेटा)
  • काम करने वाले धागे पर Thread.join() विधि को कॉल करके, काम करने वाले धागे (writeBatch निष्पादित करने के लिए) को समाप्त करने के लिए प्रतीक्षा करें।
  • कार्यक्रम बर्खास्त

कुछ अधूरा कोड:

  • एक static volatile boolean keepRunning = true;
  • में रन (जोड़े) आप

    for (int i = 0; i < N && keepRunning; ++i) 
        writeBatch(pw, i); 
    
  • करने के लिए बदल मुख्य में () आप जोड़ना:

    final Thread mainThread = Thread.currentThread(); 
    Runtime.getRuntime().addShutdownHook(new Thread() { 
        public void run() { 
         keepRunning = false; 
         mainThread.join(); 
        } 
    }); 
    

मोटे तौर पर है कि मैं कैसे एक सुंदर करना टर्मिनल में "नियंत्रण सी मार पर सभी ग्राहकों को अस्वीकार"।


the docs से:

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

है यही कारण है, एक बंद हुक JVM चल रहा जब तक हुक समाप्त कर दिया है (रन से लौटे रहता है() -method।

+11

आह - इसलिए यदि मैं सही समझता हूं, तो आप जो कह रहे हैं उसका सारांश यह है कि शटडाउन हुक के पास वर्तमान में चल रहे थ्रेड के साथ संवाद करने का अवसर है, और वीएम शट डाउन को रोकने के लिए (उदाहरण के लिए Thread.join() का उपयोग करके) जब तक यह संतुष्ट न हो कि एक त्वरित सफाई पूरी हो गई है। यही वह बिंदु है जिसे मैं याद कर रहा था। धन्यवाद! –

+1

हां। आपको यह मिला। दस्तावेज़ों से कुछ वाक्यों के साथ उत्तर अपडेट किया गया। – aioobe

+1

अग्रिम में क्षमा करें, लेकिन GracefulShutdownTest1 को चलाने योग्य नहीं होना चाहिए? – Victor

-6

शटडाउन हुक्स प्रारंभ नहीं किया गया धागे कि Runtime.addShutdownHook के साथ पंजीकृत हैं कर रहे हैं()। जेवीएम उस क्रम पर कोई गारंटी नहीं देता है जिसमें शटडाउन हुक शुरू हो जाते हैं।अधिक जानकारी के लिए http://techno-terminal.blogspot.in/2015/08/shutdown-hooks.html

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