Java kullanım İnterruptedException
InterruptedException
işleme aşağıdaki yollardan arasındaki fark nedir? Bunu yapmak için en iyi yolu nedir?
try{
//...
} catch(InterruptedException e) {
Thread.currentThread().interrupt();
}
YA
try{
//...
} catch(InterruptedException e) {
throw new RuntimeException(e);
}
EDİT: hangi senaryo bu iki kullanılır. bilmek istiyorum
CEVAP
Muhtemelen InterruptedException
atar adında bir yöntem var, çünkü bu soruyu sormak için mi geldin.
Öncelikle, ne throws InterruptedException
görmelisiniz: yöntem imzası ve aradığınız yöntemin çağrılması olası bir sonucun Bir parçası. Yani InterruptedException
bir yöntem çağrısı son derece geçerli bir sonucu olduğu gerçeğini kabul ederek başlayın.
Eğer aradığınız bu yöntem bu özel durum oluşturursa, ne yapmalıyımseninyöntem? Aşağıdaki düşünerek cevap anlayabilirsiniz:
Bu yöntem için mantıklı geliyorsanaInterruptedException
atmak için uygulama?Farklı bir ifadeyle, çağırırken InterruptedException
a mantıklı bir sonuçseninyöntem?
EğerEveto zaman
throws InterruptedException
bir parçası olmalıdırseninyöntem imzası ve dışında yaymak (yani hiç kaçırma) izin vermelisin.Örnek: Yöntem ağ üzerinden bir değer Hesaplaması bitirmek ve bir sonuca dönmek için bekler. Eğer engelleme ağ arama
InterruptedException
bir atar yöntemi normal bir şekilde hesaplama bitirebilir.InterruptedException
yaymak izin.int computeSum(Server server) throws InterruptedException { // Any InterruptedException thrown below is propagated int a = server.getValueA(); int b = server.getValueB(); return a b; }
Eğerhayıro zaman
throws InterruptedException
ile yöntemini ilan olmamalı ve gerekir (!) durum yakalamak. Şimdi iki şey önemli bu durumda akılda tutulması gereken şunlardır:Birisi iplik kesildi. Birisi muhtemelen işlemini iptal etmek için istekli, programı incelikle sonlandırmak olduğunu, ya da her neyse. Birine karşı kibar olmalısınız ve daha fazla uzatmadan yöntemi dönüş.
Olsa bileseninyöntem
InterruptedException
bir iş parçacığı kesildi aslında hala önemli olabilir diye mantıklı bir dönüş değeri üretmek için yönetmek olabilir. Özellikle, yöntemi çağıran kod bir kesinti yöntemi yürütme sırasında oluştu olup olmadığını ilginizi çekebilir. Bu yüzden bir kesinti kesintiye bayrağı ayarlayarak gerçekleşti aslında günlük:Thread.currentThread().interrupt()
Örnek: Kullanıcı iki değerlerin toplamını yazdırmak istedi. Baskı "
Failed to compute sum
" eğer toplamı hesaplanmış olabilir mi (ve bir program çökmesine izin vermek çok daha iyiInterruptedException
nedeniyle yığın izleme) kabul edilebilir. Diğer bir deyişle, yokdeğilsensethrows InterruptedException
bu metot için yapmak.void printSum(Server server) { try { int sum = computeSum(server); System.out.println("Sum: " sum); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // set interrupt flag System.out.println("Failed to compute sum"); } }
Şimdiye kadar sadece throw new RuntimeException(e)
kötü bir fikir olduğunu açık olmalıdır. Arayan çok kibar değil. Yeni bir çalışma zamanı özel durum icat edebilirdi ama kök neden (biri parçacığı yürütme durdurmak istiyor) kayıp alabilirsiniz.
Diğer örnekler:
Runnable
uygulama: Keşfetmiş olabileceğiniz gibi,Runnable.run
imzaInterruptedExceptions
rethrowing için izin vermez. Pekisanademek kiRunnable
, uygulama konusunda anlaşma imzaladısanaInterruptedExceptions
Olası anlaşma imzaladı. Ya da farklı bir arayüzü,Callable
gibi seçin veya ikinci bir yaklaşım izleyin.
Thread.sleep
aramaBir dosya okumak çalışıyorsanız ve spec arasında 10 kat ile 1 saniye denemelisiniz diyor.Thread.sleep(1000)
Ara. Yani,InterruptedException
ile uğraşmak zorunda.tryToReadFile
gibi bir yöntem gayet mantıklı demek için yapar"Eğer kesintiye olursam dosyasını okumaya çalışırken benim işlemi yapamam". Diğer bir deyişle, bu yöntem gayet mantıklıInterruptedExceptions
atmak için yapar.String tryToReadFile(File f) throws InterruptedException { for (int i = 0; i < 10; i ) { if (f.exists()) return readFile(f); Thread.sleep(1000); } return null; }
Neden Java Vector sınıfı eski veya kul...
Kullanım Başlatıcılar vs Kurucular Jav...
Ne zaman Java'In Thread yapar.İnt...
Java uygun kullanım-D komut satırı par...
Java "-by pass-başvuru" veya...