Muhabir: Bana bundan bahsedin, kanca ipliği ve uygulama senaryoları nedir?

1. Kanca ipliği girişi

Normal koşullar altında, uygulamaya bir veya daha fazla Hook (kanca) ipliği enjekte edebiliriz, böylece Program çıkmak üzereyken, yani JVM programı çıkmak üzereyken, Hook iş parçacığı yürütme için başlatılacaktır. .

Önce bir örnek kod parçasına bakın:

Basit kod

  • : Uygulamaya bir kanca dizisi enjekte edin İş parçacığında, günlükleri çalıştırma ve çıkma dahil olmak üzere ilgili günlükler yazdırılır;
  • : Aynı mantıkla bir kanca ipliğini tekrar enjekte edin;
  • : Ana iş parçacığı yürütme sona erer ve günlük yazdırılır;

Doğrulamak için bu kodu çalıştırın:

Kanca dişi yürütme sonucu

Baskı günlüğünden, ana iş parçacığının yürütülmesi sona erdiğinde, yani JVM işlemi çıkmak üzereyken, enjekte edilen iki Kanca iş parçacığının başlatıldığı ve ilgili günlüklerin yazdırıldığı görülebilir.

İki, Kanca iş parçacığı uygulama senaryosu hususları

2.1 Uygulama senaryoları

Yukarıda bildiğimiz gibi, Hook konuları JVM programı çıktığı zaman başlatılabilir ve çalıştırılabilir, o halde bu özellik ile ne yapabiliriz?

Bazı yaygın uygulama senaryolarını listeleyin:

  • Programın tekrar tekrar çalıştırılmasını önleyin , Spesifik uygulama, program başlatıldığında kilit dosyasının oluşturulup oluşturulmadığını kontrol edebilir, daha sonra programdan çıkıp, oluşturulmamışsa, kilit dosyasını oluşturabilir, program normal şekilde çalışır ve son olarak, JVM çıktığında çengel iş parçacığını enjekte edebilir. , Zincirdeki kilit dosyasını silin;
  • akış şeması

    Not: Programların tekrar tekrar çalıştırılmasını önlemek için bu strateji Mysql sunucusu, zookeeper, kafka ve diğer sistemlere de uygulandı.

  • Bazıları ayrıca Kanca ipliğinde de yürütülebilir Kaynak yayınlama Veritabanı bağlantılarını kapatma, Soket bağlantıları vb. İşlemler
  • 2.2 Dikkat edilmesi gereken konular

  • Kanca iş parçacığı yalnızca çıkış sinyalini doğru aldığında doğru şekilde çalıştırılabilir.Eğer işlemi kill -9 yoluyla öldürmeye zorlanırsanız, üzgünüz, işlem Hook iş parçacığını çalıştırmayacak. Bir düşünün, kendisi zorla öldürüldü, öyleyse başka birine nasıl bakılabilir?
  • Programın uzun süre çıkmamasına neden olacağından, lütfen Hook iş parçacığında zaman alıcı işlemler gerçekleştirmeyin.
  • Üç, Hook thread anti-uygulama yeniden başlatma savaşı

    Uygulamanın yeniden başlatılmasını engelleyen yukarıdaki senaryo için, Hook dizisini kullanacağız, gerçek bir çekim yapalım ve kodu yapıştıralım:

    java.io.File içe aktarma; java.io.IOException'ı içe aktarın; import java.util.concurrent.TimeUnit; / ** * @author (WeChat Kimliği: Xiaoha Java'yı öğrenir) * @tarih 2019/4/10 * @ saat 21:56 * @discription ** / public class PreventDuplicated { / ** .lock dosyası depolama yolu * / private static final String LOCK_FILE_PATH = "./"; / ** .lock dosya adı * / private static final String LOCK_FILE_NAME = ".lock"; public static void main (String args) { // .lock dosyasının zaten var olduğunu doğrulayın checkLockFile (); // Kanca ipliğini enjekte et addShutdownHook (); // Simülasyon programı her zaman çalışıyor için (;;) { Deneyin { TimeUnit.SECONDS.sleep (1); System.out.println ("Program çalışıyor ..."); } catch (InterruptedException e) { e.printStackTrace (); } } } / ** * Kanca ipliğini enjekte edin * / özel statik void addShutdownHook () { Runtime.getRuntime (). AddShutdownHook (new Thread (() - > { // çıkış sinyalini aldı System.out.println ("Program, öldürme sinyali aldı."); // .lock dosyasını sil deleteLockFile (); })); } / ** * .Lock dosyasının zaten var olduğunu doğrulayın * / özel statik void checkLockFile () { eğer (isLockFileExisted ()) { // .lock dosyası zaten mevcut, bir istisna oluşturun, programdan çıkın yeni RuntimeException ("Program zaten çalışıyor."); } // mevcut değil, bir .lock dosyası oluştur createLockFile (); } / ** * Bir .lock dosyası oluşturun * / özel statik void createLockFile () { Dosya dosyası = yeni Dosya (LOCK_FILE_PATH + LOCK_FILE_NAME); Deneyin { file.createNewFile (); } catch (IOException e) { e.printStackTrace (); } } / ** * .Lock dosyasının var olup olmadığı * @dönüş * / özel statik boole isLockFileExisted () { Dosya dosyası = yeni Dosya (LOCK_FILE_PATH + LOCK_FILE_NAME); return file.exists (); } / ** * .Lock dosyasını silin * / özel statik void deleteLockFile () { Dosya dosyası = yeni Dosya (LOCK_FILE_PATH + LOCK_FILE_NAME); file.delete (); } }

    Programı çalıştırın, konsol çıktısı aşağıdaki gibidir:

    Konsol çıkışı

    Program çalışıyor, bakalım .lock dosyası oluşturulmuş mu:

    kilit dosyası

    Dosya başarıyla oluşturuldu. Ardından, tekrar tekrar başlatılıp başlatılamayacağını görmek için programı tekrar çalıştırıyoruz:

    Programı tekrar tekrar başlatın, bir istisna atın

    Gördüğünüz gibi, program tekrar tekrar çalıştırılamaz ve zaten çalışan programın çalışma zamanı istisnası atılır. Sonra, işlemi sonlandırmak için kill pid veya kill -l pid komutunu kullanın:

    Kanca ipliği başladı

    Program çıkmak üzereyken Hook dizisi başlatılır ve .lock dosyasının silinip silinmediğini kontrol edin:

    .lock dosyası silindi

    Bu noktada, Hook iş parçacığı kodunun asıl kısmı bitmiştir.

    Dört, özet

    Bu yazıda Kanca (kanca) ipliğinin ne olduğunu, ilgili uygulama senaryolarını ve önlemleri öğrendik.

    Beş, Hediye | Öğrenme Refah Kaynakları ile Röportaj

    Kısa bir süre önce internette arama yaptım ve Java mülakat öğrenme materyallerinin eksiksiz ve ayrıntılı bir PDF'sini derledim ve burada sizinle paylaştım. Sadece röportaj değil, ders çalış, almaya değersin! ! !

    İlet + almak için arka planda "Java Röportajı" özel mesajını takip edin

    TVB "Stars and Horses" yeni bir dizi üzerinde çalışmaya başlıyor: "Making the Demons 2.0", Süper Doktor'u oynayacak
    önceki
    ÖzelYeni Medya Merkezi İşletmeler İkincil Hesap Endeksi (Mayıs 2018)
    Sonraki
    Kız arkadaşım inek ve domuz yemiyor! TVB, erkek yıldızları çevrenin korunması için et tüketimini azaltmaya çağırıyor: Mars'a bu kadar hızlı gitmek istemiyorum
    Honda INSPIRE veya Toyota Camry için hangisi daha iyi? Bu beni üzecek
    Ne mutlu tek çocuklar! Danıştay'ın son duyurusu: Bu yıldan itibaren her kişi 2.400 yuan alabilir
    Virgil Abloh x Air Jordan 4 ortak planlaması doğrulandı mı? Fiziksel ayakkabılar ortaya çıktı mı? !
    Evlilik haberlerini inkar edin! TVBnin birinci sınıf öğrencisi bir açıklama yaptı: Neredeyse baba olduğumu bile bilmiyordum
    Araba yapımının yeni gücü para kazanmaya mı başlıyor yoksa gerçekten araba yapımı mı?
    Trend dünyasında "tavuk yemek" ister misiniz? 98K, bir çift güzel askeri bot kadar kullanışlı değil!
    Zaobao ofo bilgi modülünü başlattı; bugünün manşet dahili testi ücretli okuma işlevi
    Yardım müzayedesi için ilk ev sahibi! TVB "doğru ve yanlış" açıkça: olay yerindeki insanların yüzünü göstermeyeceğinden endişeleniyor
    Duvar Havuzu 1970'lerin eski filminde, 2018 gucci gölgesini görebilirsiniz.
    Yurtdışı siyah teknolojisiBilgisayar ve fotokopi makinesi yenilmez masa; 8 saat pil ömrüne sahip kablosuz kulaklık
    Queqiao, Chang'e-4'ü aradı: "İstasyona vardım. Bu, ayın arkasını ve dünyayı görebilir, sizi bekliyor!"
    To Top