"Merhaba, Amigo!

"Yeni olan her şey, unuttuğumuz eski bir şeydir. Bugün ileti dizilerini durdurmaktan bahsedeceğim. Umarım interrupt() yönteminin nasıl çalıştığını çoktan unutmuşsunuzdur."

"Evet Ellie, tamamen unutmuşum."

"Harika. O zaman sana hatırlatırım."

"Java'da, biri çalışan bir iş parçacığını durdurmak isterse, bunu iş parçacığına işaret edebilir. Bunu yapmak için, Thread nesnesinin gizli isInterrupted değişkenini true olarak ayarlamanız gerekir."

"Her Thread, bu bayrağı ayarlamak için kullanılan bir interrupt() metoduna sahiptir. interrupt () metodu çağrıldığında, Thread nesnesinin içindeki isInterrupted değişkeni true olarak ayarlanır."

"Ve bir iş parçacığında Thread.sleep() veya birleştirme() yöntemi çağrıldığında, yöntem, geçerli iş parçacığı için isInterrupted bayrağının ayarlanıp ayarlanmadığını kontrol eder. Bu bayrak ayarlanırsa (isInterrupted değişkeni true'ya eşittir), o zaman yöntemler bir InterruptedException atın ."

"Burada size eski bir örneği hatırlatacağım:"

kod Tanım
class Clock implements Runnable
{
public void run()
{
Thread current = Thread.currentThread();

while (!current.isInterrupted())
{
Thread.sleep(1000);
System.out.println("Tik");
}
}
}
Clock'un run yöntemi, geçerli iş parçacığı için Thread nesnesini alır.

Clock sınıfı, mevcut iş parçacığının isInterrupt değişkeni yanlış olduğu sürece konsola saniyede bir kez "Tick" yazar.

isInterrupt true olduğunda, çalıştırma yöntemi sonlandırılır.

public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
clockThread.interrupt();
}
Ana iş parçacığı, sonsuza kadar çalışması gereken bir alt iş parçacığı (saat) başlatır.

10 saniye bekleyin ve interrupt yöntemini çağırarak görevi iptal edin.

Ana iş parçacığı işini bitirir.

Saat iş parçacığı işini bitirir.

"Burada run metodunda sonsuz bir döngünün parçası olarak uyku metodunu kullanıyoruz . Döngüde, isInterrupt değişkeni otomatik olarak kontrol edilir. Bir iş parçacığı uyku yöntemini çağırırsa , yöntem önce isInterrupt'un o iş parçacığı için doğru olup olmadığını kontrol eder ( uyku yöntemini çağıran bir tanesi). Doğruysa, yöntem uyumaz. Bunun yerine bir InterruptedException fırlatır ."

"Fakat bu örnekte, döngünün durumundaki isInterrupted değişkenini sürekli kontrol ediyoruz."

"Bu yaklaşımı kullanmamamızın bazı nedenleri olduğunu hatırlıyorum. Bana hatırlatabilir misin?"

" İlk olarak , run yönteminin her zaman bir döngüsü yoktur. Yöntem, diğer yöntemlere yapılan birkaç düzine çağrıdan oluşabilir. Bu durumda, her yöntem çağrısından önce bir isInterrupted kontrolü eklemeniz gerekir."

" İkincisi , pek çok farklı eylemi içeren bazı yöntemlerin yürütülmesi çok uzun zaman alabilir."

" Üçüncüsü , bir istisna atmak isInterrupted kontrolünün yerine geçmez. Bu sadece uygun bir eklemedir. Atılan istisna, çağrı yığınını hızlı bir şekilde run yönteminin kendisine geri sarmanıza olanak tanır. "

" Dördüncüsü , uyku yöntemi çok kullanılıyor. Görünüşe göre bu yararlı yöntem, daha az yardımcı olmayan örtülü bir kontrolle geliştirilmiş. Sanki  kimse özel olarak çek eklememiş gibi, ama işte burada  . başkasının kodunu kullanıyorsunuz ve çeki kendiniz ekleyemezsiniz."

" Beşincisi , ek kontrol performansı düşürmez. Uyku yöntemini çağırmak, iş parçacığının (uyku dışında) hiçbir şey yapmaması gerektiği anlamına gelir, bu nedenle fazladan çalışma kimseyi rahatsız etmez."

"Az önce söylediğin tam olarak buydu."

"Peki, « Hiç kimse bir dizinin durdurulacağını garanti edemez. Yalnızca bir dizi kendi kendini durdurabilir. » İfadeniz ne olacak? Bunu açıklayabilir misiniz?

"Elbette."

"Önceden, Java'nın ilk sürümlerinde, iş parçacıklarının bir stop() yöntemi vardı. Ve onu çağırdığınızda, JVM aslında iş parçacığını durdurdu. OS işlevleri) bu şekilde kesintiye uğradığında, kesinti kapatılmamış dosyalar, yayınlanmamış sistem kaynakları vb. gibi birçok soruna neden oldu."

"Java'nın yaratıcılarının genel bir toplantısı, dizileri zorla durdurma yöntemini kaldırmaya karar verdi. Artık tek yapabileceğimiz belirli bir bayrak (isInterrupted) ayarlamak ve bu bayrağın işlenmesi için iş parçacığı kodunun doğru yazıldığını ummak. Bu bayrak 'İplik, dur lütfen, çok önemli' diyen bir tabela gibi ama durup durmaması kendi bileceği iş."

"Ama InterruptedException ne olacak?"

"Ya bu iş parçacığında çalışan kodda bir sürü try-catch bloğu varsa? Bir yerde bir InterruptedException meydana gelse bile, bazı try-catch'lerin onu yakalayıp unutmayacağının kesinlikle bir garantisi yoktur. iş parçacığı duracak."

"Başka bir şey de, dizilerin zaten oldukça düşük seviyeli programlama olarak kabul edilmesi. Ama bunu sana bir dahaki sefere anlatacağım."

"Sen Ellie değilsin, sen Şehrazad'sın!"

"Pekala, Amigo! Şu anki dersteki her şey açık mı?"

"Evet."

"Tamam iyi."