SORU
20 EKİM 2010, ÇARŞAMBA


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
20 EKİM 2010, ÇARŞAMBA


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:

    1. 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üş.

    2. 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 iyi InterruptedException nedeniyle yığın izleme) kabul edilebilir. Diğer bir deyişle, yokdeğilsense throws 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 imza InterruptedExceptions rethrowing için izin vermez. Pekisanademek ki Runnable, 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;
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Joseph Hayhoe

    Joseph Hayho

    20 Mayıs 2010
  • Mr_BrettHooge

    Mr_BrettHoog

    3 Ocak 2011
  • super1988guy

    super1988guy

    9 Aralık 2007