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
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.
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:
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ı.
2.2 Dikkat edilmesi gereken konular
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.
Bu yazıda Kanca (kanca) ipliğinin ne olduğunu, ilgili uygulama senaryolarını ve önlemleri öğrendik.
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