"Merhaba Amigo! Ellie'nin İptal fikrinin harika olduğunu kabul etmelisin."
"Evet."
"Aslında, Thread sınıfında benzer bir şey var . Yalnızca değişkenin adı isCancel değil . Adı isInterrupt . Ve iş parçacığını durdurmak için kullanılan yöntem cancel() değil . Bu interrupt() ."
"Gerçekten mi?"
"Evet. Şuna bir bak:"
kod | Tanım |
---|---|
|
Birkaç iş parçacığı aynı Clock nesnesinde run yöntemini çağırabileceğinden , geçerli iş parçacığı için Thread nesnesini alırız .
Clock sınıfı, geçerli iş parçacığının isInterrupt değişkeni yanlış olduğu sürece konsola saniyede bir "Tick" sözcüğü yazar . isInterrupt true olduğunda , çalıştırma yöntemi sona erer . |
|
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 tamamlar. Saat iş parçacığı işini bitirir. |
Ayrıca run yönteminde insanların sonsuz döngülerde kullanmayı çok sevdikleri uyku yöntemi , isInterrupt değişkenini otomatik olarak kontrol eder . Bir iş parçacığı uyku yöntemini çağırırsa , yöntem önce o iş parçacığı için isInterrupt'un doğru olup olmadığını kontrol eder. Doğruysa, yöntem uyumaz. Bunun yerine, bir InterruptedException istisnası atar .
"Neden bir istisna atalım? Bir döngüye isInterrupted() yerine isCancel() koymak daha iyi olmaz mıydı?"
" Öncelikle , 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. O zaman, her yöntem çağrısından önce bir isInterrupted denetimi eklemeniz gerekir."
" İkincisi , pek çok farklı eylem içeren bazı yöntemlerin uygulanması ç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ünen o ki, bu yararlı yöntem, daha az yardımcı olmayan örtülü bir denetimle geliştirilmiş. Sanki kimse özel olarak çek eklememiş gibi, ama işte orada . 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."
"Bunlar ciddi tartışmalar."
"Ve son olarak , şu var: Çalıştırma yönteminiz başka birinin kodunu, yani erişiminizin olmadığı kodu (kaynak kodu ve/veya kodu değiştirme haklarınız) çağırabilir. isInterrupted kontrolleri olmayabilir ve kullanabilir " tüm istisnaları yakalamak için ... catch (İstisna e) " deneyin ."
Bir dizinin durdurulacağını kimse garanti edemez. Yalnızca bir iş parçacığı kendini durdurabilir.
GO TO FULL VERSION