জাভাতে শাটডাউন হুকের কার্যকর উদাহরণ?


125

আমি নিশ্চিত করার চেষ্টা করছি যে আমার জাভা অ্যাপ্লিকেশনটি দৃ be় হওয়ার জন্য যুক্তিসঙ্গত পদক্ষেপ নেয় এবং এর একটি অংশ নিখুঁতভাবে বন্ধ করা জড়িত। আমি শাটডাউন হুক সম্পর্কে পড়ছি এবং বাস্তবে সেগুলি কীভাবে ব্যবহার করা যায় তা আমি পাই না।

কোন বাস্তব উদাহরণ আছে কি?

ধরা যাক আমার নীচের মতো এর মতো একটি খুব সহজ অ্যাপ্লিকেশন ছিল, যা একটি ফাইলের জন্য ১০০ এর ব্যাচে একটি লাইনে একটি সংখ্যা লিখে, এবং প্রোগ্রামটি বাধাগ্রস্ত হলে আমি নিশ্চিত করতে চাই যে একটি প্রদত্ত ব্যাচ শেষ হয়েছে। আমি কীভাবে একটি শাটডাউন হুকটি নিবন্ধিত করতে পারি তবে কীভাবে আমার অ্যাপ্লিকেশনটিতে এটি সংহত করা যায় তা সম্পর্কে আমার কোনও ধারণা নেই। কোনও পরামর্শ?

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();
        }
    }
}

উত্তর:


160

আপনি নিম্নলিখিত করতে পারেন:

  • শাটডাউন হুকটি কিছু অ্যাটমিকবুলিয়ান (বা উদ্বায়ী বুলেটিয়ান) "কিপ রেনিং" কে মিথ্যা হিসাবে সেট করুন
  • (Allyচ্ছিকভাবে, .interruptকাজ করার থ্রেডগুলি যদি তারা কিছু ব্লকিং কলটিতে ডেটার জন্য অপেক্ষা করে)
  • কাজের থ্রেডগুলিতে পদ্ধতিটি writeBatchকল করে কাজের থ্রেডগুলি ( আপনার ক্ষেত্রে কার্যকর করা) শেষ হওয়ার জন্য অপেক্ষা করুন Thread.join()
  • প্রোগ্রামটি শেষ করুন

কিছু স্কেচি কোড:

  • যুক্ত কর একটি 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();
        }
    });

মোটামুটিভাবে আমি কীভাবে টার্মিনালে "কন্ট্রোল-সি মারার পরে সমস্ত ক্লায়েন্টকে প্রত্যাখ্যান করি"।


ডক্স থেকে :

ভার্চুয়াল মেশিনটি যখন শাটডাউন ক্রমটি শুরু করবে এটি কিছু অনির্দিষ্ট ক্রমে সমস্ত নিবন্ধিত শাটডাউন হুক শুরু করবে এবং তাদের একযোগে চলতে দেবে। সমস্ত হুকস শেষ হয়ে গেলে এটি চূড়ান্তকরণ-অন-প্রস্থান সক্ষম করা থাকলে সমস্ত অনিবন্ধিত চূড়ান্তকারীগুলি চালিত হবে। অবশেষে, ভার্চুয়াল মেশিনটি বন্ধ হয়ে যাবে।

অর্থাত্ হট বন্ধ না হওয়া ( রান () -মোথড থেকে প্রত্যাবর্তন না হওয়া পর্যন্ত একটি শাটডাউন হুক জেভিএমকে চালিয়ে রাখে।


14
আহ - সুতরাং আমি যদি সঠিকভাবে বুঝতে পারি তবে আপনি যা বলছেন তার সংক্ষেপে হ'ল শাটডাউন হুকের বর্তমানে চলমান অন্যান্য থ্রেডগুলির সাথে যোগাযোগ করার এবং ভিএম শাটডাউন বন্ধ করার সুযোগ রয়েছে (যেমন থ্রেড.জোঁইন () ব্যবহার করে) ) যতক্ষণ না এটি সন্তুষ্ট হয় যে একটি দ্রুত পরিষ্কার শেষ হয়েছে। এটাই আমার অনুপস্থিত ছিল। ধন্যবাদ!
জেসন এস

2
হ্যাঁ. তুমি বুঝতে পেরেছ. ডক্স থেকে কয়েকটি বাক্য সহ উত্তর আপডেট করুন Updated
আইয়ুব

1
অগ্রিম দুঃখিত, তবে গ্রেসফুলশুটাউনটেষ্ট 1 রান্নেবল বাস্তবায়ন করা উচিত নয়?
ভিক্টর

এটি কি মূল থ্রেডে একটি জিইউআই চালু করেছিল? আমি জানি এটি করার সর্বোত্তম উপায় নয় (পরিবর্তে ইডিটি ব্যবহার করুন) তবে আমি পুরানো কোডটিতে কাজ করছি।
অ্যাগোস্টিনো

1
@ মার্টিনাস জুসেভিয়াস, জেভিএম যখন সমাপ্ত হয় তখন সমস্ত নন-ডেমন থ্রেড বন্ধ হয়ে যায়। যদি এটি mainThreadকোনও ডেমন থ্রেড হয়, তবে joinজেভিএম বন্ধ করার আগে আমরা গ্যারান্টি সহ এটি শেষ করার জন্য অপেক্ষা করি।
আইয়ুব

-9

শাটডাউন হুক্স unstarted থ্রেড যে Runtime.addShutdownHook () এর সাথে নিবন্ধভুক্ত করা হয়। জেভিএম যা শাটডাউন আঙ্গুলসমূহ started.For আরও তথ্য পড়ুন হয় অর্ডার কোনো গ্যারান্টি দেয় না http://techno-terminal.blogspot.in/2015/08 /shutdown-hooks.html

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.