SORU
27 Mayıs 2010, PERŞEMBE


Java kapatma kanca yararlı örnek?

Java uygulaması gerekli adımları sağlam olması için alır emin olmak için çalışıyorum, ve bunun bir parçası düzgün biçimde kapatma içerir. shutdown hooks hakkında okuyorum ve aslında pratikte bunları kullanmak için nasıl anlamıyorum.

Orada pratik bir örnek var mı?

Diyelim ki ben bir çok basit bir uygulama gibi bu bir aşağıda, hangi yazar bir numara, dosya, 10 satır, toplu 100, ve ben istiyorum emin olmak için belirli bir toplu biterse programı yarıda kesti. Kapatma kanca nasıl kayıt altına alıyorum ama benim uygulama içine entegre etmek için nasıl hiçbir fikrim yok. Herhangi bir öneriniz var mı?

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

CEVAP
27 Mayıs 2010, PERŞEMBE


Aşağıdakileri yapabilirsiniz:

  • İzin kapatma kanca bazı AtomicBoolean ayarlayın (veya değişken boolean) "keepRunning" yanlış
  • (İsteğe bağlı olarak, .interrupt Bazı engelleme çağrı veri beklerler eğer çalışma konuları)
  • Çalışma konuları (sizin durumunuzda writeBatch yürütme), çalışma konuları Thread.join() yöntemini çağırarak bitirmesini bekleyin.
  • Programı sonlandırmak

Sorunlu kod:

  • static volatile boolean keepRunning = true; ekleyin
  • () çalıştırındeğiştirin

    for (int i = 0; i < N && keepRunning;   i)
        writeBatch(pw, i);
    
  • () anaekleyin:

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

""Terminal. Control-C vurmak üzerine tüm istemcilerin reddetme nazikçe yapıyorum kabaca.


the docs:

Sanal makine kapatma sırası başladığında biraz belirtilmemiş sırayla tüm kayıtlı kapatma kanca başlatmak ve onları aynı anda çalıştırmak izin verir.Tüm kancaları tamamlandıktan sonra sonuçlandırılması-çıkış etkinse tüm uninvoked sonlandırıcı çalışır. Son olarak, sanal makine duracaktir.

Yani, kapatma kanca JVM kanca sonlandırdı kadar tutar (döndü() çalıştırın-yöntem.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ASUS North America

    ASUS North A

    12 AĞUSTOS 2008
  • Motor Trend Channel

    Motor Trend

    11 Mart 2006
  • Rootjunky.com

    Rootjunky.co

    22 EKİM 2011