İleti dizileri genellikle arka plan geliştirmede kullanılır, bu nedenle ileti dizisini her kapattığınızda düzeliyor musunuz?
Özellikle, programcıların daha fazla sorun yaşamasına neden olan çok iş parçacıklı geliştirme senaryoları giderek artmaktadır. .
Bugün ipliği nasıl doğru bir şekilde durduracağımıza geldik. . .
Java dili tasarımı iş parçacığının doğru durmasını sağlar ve durdurulan iş parçacığının kendisine adım atar. Durdurulan iş parçacığı ne zaman duracağını bilir.
Konsol çıkışı
Konu başladı
Nihai yürütme sonucu: 2147483647
Sonuçlardan, son program hala normal şekilde yürütülüyor.Açan tarafta kesme işlemini gerçekleştirmemize rağmen, iş parçacığı yürütme gövdesindeki kesme işlemini işlemedik.Çağrı yapan taraf bir kesme sinyali verse bile, iş parçacığı yürütme gövdemiz Boşver. Daha sonra, işlemin iş parçacığı gövdesinde nasıl kesileceğine bakalım.
public class MyNormalInterruptDemo { public static void main (String args) InterruptedException {atar Thread thread = new Thread (yeni MyNormalInterrupt ()); thread.start (); // Yürütmeden sonra, işlemeyi kes Thread.sleep (1000); thread.interrupt (); } } class MyNormalInterrupt Runnable { @Override public void run () { System.out.println ("İş parçacığı yürütülmeye başladı"); int i = 0; süre (ben < Tamsayı.MAX_VALUE! Thread.currentThread (). İsInterrupted ()) { i ++; } System.out.println ("Nihai yürütme sonucu:" + i); } }Konsol
Konu başladı
Nihai yürütme sonucu: 1103717170
Açıktır ki, nihai yürütme sonucu 2147483647 olduğu için program çalıştırılmamıştır. Döngü durumunda, iş parçacığının kesilip kesilmediğine ve iş parçacığının nasıl kesildiğine, döngü sona erdiğine ve iş parçacığının yürütülmesine ilişkin bir koşul eklenir.
kod aşağıdaki gibi gösterilir:
public class MySleepInterruptDemo { public static void main (String args) InterruptedException {atar Thread thread = new Thread (yeni MySleepInterrupt ()); thread.start (); // Yürütmeden sonra, işlemeyi kes Thread.sleep (100); thread.interrupt (); } } class MySleepInterrupt Runnable { @Override public void run () { System.out.println ("İş parçacığı yürütülmeye başladı"); Deneyin { int i = 0; süre (ben < Tamsayı.MAX_VALUE! Thread.currentThread (). İsInterrupted ()) { i ++; } Thread.sleep (1000L); System.out.println ("Nihai yürütme sonucu:" + i); } catch (InterruptedException e) { e.printStackTrace (); } } }Konsol
Konu başladı
java.lang.InterruptedException: uyku kesildi
java.lang.Thread.sleep (Yerel Yöntem)
com.karl.concurrent.chapter07.MySleepInterrupt.run (MySleepInterruptDemo.java:28) adresinde
java.lang.Thread.run'da (Thread.java:748)
Run yönteminde uyku yöntemi yürütüldüğünde, InterruptedException istisnası alması istenir
Bir iş parçacığı uyurken bir kesme sinyali aldığında, yanıt vermenin yolu bir InterruptedException oluşturmaktır.
Kod aşağıdaki gibidir:
public class MyEveryLoopSleepInterruptDemo { public static void main (String args) InterruptedException {atar Thread thread = new Thread (yeni MyEveryLoopSleepInterrupt ()); thread.start (); // Yürütmeden sonra, işlemeyi kes Thread.sleep (100); thread.interrupt (); } } class MyEveryLoopSleepInterrupt Runnable { @Override public void run () { System.out.println ("İş parçacığı yürütülmeye başladı"); Deneyin { int i = 0; süre (ben < Tamsayı.MAX_VALUE! Thread.currentThread (). İsInterrupted ()) { i ++; Thread.sleep (10L); } System.out.println ("Nihai yürütme sonucu:" + i); } catch (InterruptedException e) { e.printStackTrace (); } } }Konsol
Konu başladı
java.lang.InterruptedException: uyku kesildi
java.lang.Thread.sleep (Yerel Yöntem)
com.karl.concurrent.chapter07.MyEveryLoopSleepInterrupt.run (MyEveryLoopSleepInterruptDemo.java:29)
java.lang.Thread.run'da (Thread.java:748)
Yukarıdaki kod ile iş parçacığı engelleme arasındaki farkı gözlemleyin
Nedeni: İş parçacığının yürütme gövdesinde, çoğu zaman iş parçacığı uyku durumunda olduğundan ve kesilen iş parçacığı bir InterruptedException istisnası atar.Bu zamanda, döngü koşulunun yargısı aslında gereksizdir. Bu nedenle, her döngüde kesintiye uğrayıp uğramadığını kontrol etmeye gerek yoktur. Çünkü döngü içinde uyumak, bu kesintiye cevap vermemize yardımcı olacaktır.
Eğer try catch kullanılırsa, kesme geçersiz olacaktır. Kod aşağıdaki gibidir:
public class MyErrorInterruptDemo { public static void main (String args) InterruptedException {atar Thread thread = new Thread (yeni MyErrorInterrup ()); thread.start (); // Yürütmeden sonra, işlemeyi kes Thread.sleep (100); thread.interrupt (); } } class MyErrorInterrup, Runnable { @Override public void run () { System.out.println ("İş parçacığı yürütülmeye başladı"); int i = 0; süre (ben < Tamsayı.MAX_VALUE! Thread.currentThread (). İsInterrupted ()) { i ++; Deneyin { Thread.sleep (10L); } catch (InterruptedException e) { e.printStackTrace (); } } System.out.println ("Nihai yürütme sonucu:" + i); } }Konsol
İş parçacığı neden sürekli çalışıyor?
Şöyle nedenleri vardır:
Çünkü Java, Uyku yöntemi mekanizmasını ayarladığında, kesme yanıtlandığında, iş parçacığının kesme bayrağı açıktır, çünkü kesmeye yanıt verdiğimizde, yargılama koşulu gerçekten başarısız olduğu için iş parçacığının kesme bayrağı bitini kullanmaya devam ederiz. Bunu görünce, aniden farkına varan birçok arkadaş olmalı.
Konsol
Yukarıdaki kodun temel problemi herkesin açık olması gerektiğini düşünüyorum .. method () metodunu çağırma sürecinde uçbirim yanıtı denendiği / yakalandığı için run metodu algılanamıyor. Böylece iş parçacığı her zaman çalışıyor.
Bu nedenle, asıl sorun yöntem yönteminde yatmaktadır.Kesme yanıtı çalıştırma yöntemine kusulamaz Yöntem yöntemi, kesme istisnasını kendi başına çözemese bile, doğru yaklaşım rapor edilmelidir.Yüksek seviye (çağrı yöntemi yöntemi) duruma göre halleder. Özel olarak çözülmedi.
Doğru kod şuna benzer:
public class RightWayStopThreadInProd { public static void main (String args) InterruptedException {atar Thread thread = new Thread (yeni MyRightWayStopThreadInProd ()); thread.start (); Thread.sleep (100); thread.interrupt (); } } class MyRightWayStopThreadInProd Runnable { @Override public void run () { System.out.println ("İşin yürütülmesini başlat"); while (true) { // Yürütme sırasında diğer yöntemleri çağırmayı simüle edin Deneyin { Bu method(); } catch (InterruptedException e) { // Çalıştırma yönteminde hata oluşturamayacağınız için, burada yapabileceğimiz şey günlüğü kaydetmek veya programın çalışmasını durdurmaktır. System.out.println ("Günlüğü kaydet / çalışmakta olan programı durdur"); e.printStackTrace (); } } } private void yöntemi () InterruptedException {atar Thread.sleep (1000); } }Bir kesinti göndermek istemediğimizde veya kesintiye uğratamadığımızda, kesinti işlemeye devam edebiliriz.
Catch deyiminde, sonraki yürütmede bir kesinti olup olmadığını kontrol etmek için, kesmeyi sürdürmek için Thread.currentThread (). İnterrupt () öğesini çağırın. Kusmanın ve sözünü kesmenin anlamının yukarıdaki açıklamasıdır.
Spesifik kod aşağıdaki gibidir
public class RightWayStopThreadInProd2 { public static void main (String args) InterruptedException {atar Thread thread = new Thread (yeni MyRightWayStopThreadInProd ()); thread.start (); Thread.sleep (2000); thread.interrupt (); } } class MyRightWayStopThreadInProd2 Runnable { @Override public void run () { System.out.println ("İşin yürütülmesini başlat"); while (true) { eğer (Thread.currentThread (). isInterrupted ()) { System.out.println ("Bir kesinti oluştu, yürütmeden çık"); kırmak; } // Yürütme sırasında diğer yöntemleri çağırmayı simüle edin Bu method(); } } özel boşluk yöntemi () { Deneyin { Thread.sleep (4000); } catch (InterruptedException e) { Thread.currentThread (). İnterrupt (); e.printStackTrace (); } } }Konsol
İşe başla
java.lang.InterruptedException: uyku kesildi
java.lang.Thread.sleep (Yerel Yöntem)
com.karl.concurrent.chapter07.MyRightWayStopThreadInProd.method (RightWayStopThreadInProd.java:35)
com.karl.concurrent.chapter07.MyRightWayStopThreadInProd.run (RightWayStopThreadInProd.java:29)
java.lang.Thread.run'da (Thread.java:748)
Bir kesinti meydana geldi, yürütmeden çık
Şu anda, her döngüde üst katmanda bir kesinti olup olmadığına karar vermemiz gerekiyor.
Yukarıda iş parçacığı engellemenin yanıt kesintisini açıklıyoruz, benzer şekilde aşağıdaki gibi başka yöntemler de var:
Bunu görünce, herkesin iş parçacığı kesintisi konusunda belirli bir anlayışa sahip olduğuna inanıyorum. Sınırlı yeteneklerim ve ifadelerim var ve bunları zamanında düzeltmeyi umuyorum.