İplik kesme mekanizması, yaptığı şeyi durdurma isteğine yanıt vermek için (işbirliği yapan) bir iş parçacığı elde etmenin tercih edilen yoludur. Herhangi bir iş parçacığı (sanırım iş parçacığı dahil) interrupt()
bir İş Parçacığını arayabilir .
Pratikte, normal kullanım durumları interrupt()
, bir tür çerçeve veya yöneticinin, bazı çalışan iş parçacığına yaptıklarını durdurmasını söyler. Çalışan iş parçacığı "kesinti farkındaysa", bir istisna yoluyla veya kesintiye uğrayan bayrağını periyodik olarak kontrol ederek kesintiye uğradığını fark edecektir. Kesildiğini fark eden iyi huylu bir ileti dizisi yaptığı şeyi bırakıp kendi kendini bitirir.
Yukarıdaki kullanım durumunu varsayarsak, kodunuz bir Java çerçevesinde veya bazı çalışan iş parçacığından çalıştırılırsa büyük olasılıkla kesintiye uğrayacaktır. Ve kesintiye uğradığında, kodunuz yapmakta olduğu şeyi bırakmalı ve en uygun yollarla kendisinin bitmesine neden olmalıdır. Kodunuzun nasıl çağrıldığına bağlı olarak, bu, geri dönülerek veya bazı uygun istisnalar atılarak yapılabilir. Ama muhtemelen aramamalı System.exit()
. (Uygulamanız neden kesintiye uğradığını bilmeyebilir ve çerçeve tarafından kesintiye uğratılması gereken başka iş parçacığı olup olmadığını kesinlikle bilmez.)
Öte yandan, kodunuz bazı çerçevelerin kontrolü altında çalışacak şekilde tasarlanmamışsa InterruptedException
, bunun beklenmedik bir istisna olduğunu iddia edebilirsiniz ; yani bir hata. Bu durumda, istisnayı diğer hatalar gibi ele almalısınız; örneğin, onu kontrol edilmemiş bir istisnaya sarın ve diğer beklenmedik kontrol edilmemiş istisnalarla uğraştığınız noktada yakalayın ve günlüğe kaydedin. (Alternatif olarak, uygulamanız kesmeyi yok sayabilir ve yaptığı şeyi yapmaya devam edebilir.)
1) Diğer iş parçacıklarını asla kendim kesmiyorsam, InterruptedException'ı ne tetikleyebilir?
Senin eğer bir örneği olduğunu Runnable
nesneler bir kullanılarak yürütülür ExecutorService
ve shutdownNow()
hizmet denir. Ve teoride, herhangi bir 3. taraf iş parçacığı havuzu veya iş parçacığı yönetimi çerçevesi yasal olarak böyle bir şey yapabilir.
2) Interrupt () kullanarak diğer iş parçacıklarını asla kesmiyorsam ... InterruptedException
o zaman ne anlama geliyor? Birini yakaladığımda ne yapmalıyım? Uygulamamı kapat?
interrupt()
Aramaları neyin neden yaptığını anlamak için kod tabanını analiz etmeniz gerekir . Bunu anladıktan sonra, uygulamanızın << bölümünün ne yapması gerektiğini >> hesaplayabilirsiniz.
Neden InterruptedException
atıldığını anlayana kadar, bunu zor bir hata olarak ele almanızı tavsiye ederim; örneğin, günlük dosyasına bir yığın izi yazdırın ve uygulamayı kapatın. (Açıkçası, bu her zaman doğru cevap değildir ... ama asıl mesele şu ki, bu "bir hata" ve geliştiricinin / bakımcının dikkatine sunulması gerekiyor.)
3) Kimin / neyin aradığını nasıl öğrenebilirim interrupt()
?
Buna iyi bir cevap yok. Önerebileceğim en iyi şey Thread.interrupt()
, çağrı yığınına bir kesme noktası ayarlamak ve buna bakmaktır.