Doğru varsayılan seçim, atış listenize InterruptedException eklemektir. Bir Kesme başka bir iş parçacığının iş parçacığının bitmesini istediğini gösterir. Bu isteğin nedeni açıklığa kavuşturulamamıştır ve tamamen bağlamsaldır, bu nedenle başka bir bilginiz yoksa, bunun sadece kolay bir kapatma olduğunu varsaymanız gerekir ve kapatmayı önleyen her şey kolay olmayan bir yanıttır.
Java rastgele InterruptedException'ın atmayacak, tüm tavsiyeler uygulamanızı etkilemeyecektir, ancak geliştiricinin "yutmak" stratejisini takip etmesinin çok rahatsız edici olduğu bir durumla karşılaştım. Bir takım büyük bir test seti geliştirdi ve Thread kullandı. Şimdi testleri CI sunucumuzda yapmaya başladık ve bazen koddaki hatalar nedeniyle kalıcı beklemelere yapışacaktık. Durumu daha da kötüleştirmek için, CI işini iptal etmeye çalışırken hiçbir zaman kapanmadı çünkü testi iptal etmek için tasarlanan Kesinti işi iptal etmedi. Kutuya giriş yapmak ve süreçleri manuel olarak öldürmek zorunda kaldık.
Uzun lafın kısası, sadece InterruptedException özel durumunu atarsanız, iş parçacığınızın sona ermesi gereken varsayılan niyetle eşleşirsiniz. Eğer atma listenize InterruptedException ekleyemezseniz, bir RuntimeException içine kaydırın.
InterruptedException'ın RuntimeException'ın kendisi olması gerektiğine dair çok rasyonel bir argüman vardır, çünkü bu daha iyi bir "varsayılan" işlemeyi teşvik eder. Bu sadece bir RuntimeException değildir, çünkü tasarımcılar kategorik bir kurala RuntimeException kodunuzda bir hatayı temsil etmelidir. Bir InterruptedException doğrudan kodunuzdaki bir hatadan kaynaklanmadığı için değil. Ancak gerçek şu ki, kodunuzda bir hata olduğu için (yani sonsuz döngü, ölü kilit) ve Interrupt bu hatayı ele almak için başka bir iş parçacığının yöntemidir.
Yapılacak rasyonel temizlik olduğunu biliyorsanız, yapın. Kesinti için daha derin bir neden biliyorsanız, daha kapsamlı bir işlem yapabilirsiniz.
Özet olarak, ele alma tercihleriniz bu listeye uymalıdır:
- Varsayılan olarak, atışlara ekleyin.
- Atmalara eklenmesine izin verilmezse, RuntimeException (e) öğesini atın. (Çoklu kötü seçeneklerin en iyi seçimi)
- Yalnızca Kesme'nin açık bir nedenini biliyorsanız, istediğiniz gibi işleyin. İşleme yönteminiz için yerel ise, Thread.currentThread (). İnterrupt () çağrısı ile kesildi.