Java'nın Thread.sleep özelliği InterruptedException'ı ne zaman atar?


110

Java'nın Thread.sleep özelliği InterruptedException'ı ne zaman atar? Görmezden gelmek güvenli mi? Herhangi bir çoklu okuma yapmıyorum. Bazı işlemleri yeniden denemeden önce birkaç saniye beklemek istiyorum.



1
Hangi anlamda "görmezden gel" demek istediğine bağlı. InterruptedExceptionEğer idare sürece derlemek ya katılır veya bir uyur herhangi yöntem üzerinde istisnasız bu tür ilan edemeyeceğini böylece bir yakalanmış istisna olduğu Threadhalde sesli aramalar wait()üzerinde Object.
8bitjunkie

Yanıtlar:


41

Genelde istisnayı görmezden gelmemelisiniz. Aşağıdaki kağıda bir göz atın:

Kesintileri yutmayın

Bazen, Runnable tarafından tanımlanan bir görevin kesilebilir bir yöntemi çağırması gibi, InterruptedException oluşturmak bir seçenek değildir. Bu durumda, InterruptedException'ı yeniden atamazsınız ancak hiçbir şey yapmak istemezsiniz. Bir engelleme yöntemi kesinti algıladığında ve InterruptedException attığında, kesintiye uğramış durumu temizler. InterruptedException'ı yakalar ancak yeniden atamazsanız, kesintinin meydana geldiğine dair kanıtları korumalısınız, böylece çağrı yığınının üst kısmındaki kod, kesintiyi öğrenebilir ve isterse yanıt verebilir. Bu görev, Liste 3'te gösterildiği gibi, geçerli iş parçacığını "yeniden kesmek" için interrupt () çağrısıyla gerçekleştirilir. En azından, InterruptedException'ı her yakaladığınızda ve yeniden atmadığınızda, geri dönmeden önce mevcut iş parçacığını yeniden kesin.

public class TaskRunner implements Runnable {
    private BlockingQueue<Task> queue;

    public TaskRunner(BlockingQueue<Task> queue) { 
        this.queue = queue; 
    }

    public void run() { 
        try {
             while (true) {
                 Task task = queue.take(10, TimeUnit.SECONDS);
                 task.execute();
             }
         }
         catch (InterruptedException e) { 
             // Restore the interrupted status
             Thread.currentThread().interrupt();
         }
    }
}

Tüm makaleyi burada görün:

http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html?ca=drs-


38

Bir InterruptedExceptionatılırsa, bir şeyin o iş parçacığını kesmek (genellikle sonlandırmak) istediği anlamına gelir. Bu, iş parçacıkları interrupt()yöntemine yapılan bir çağrı ile tetiklenir . Bekleme yöntemi bunu algılar ve bir InterruptedExceptionkod atar, böylece yakalama kodu sonlandırma talebini hemen işleyebilir ve belirtilen süre dolana kadar beklemek zorunda kalmaz.

Tek iş parçacıklı bir uygulamada (ve ayrıca bazı çok iş parçacıklı uygulamalarda) kullanırsanız, bu istisna hiçbir zaman tetiklenmez. Boş bir catch cümlesine sahip olarak görmezden gelmeyi tavsiye etmem. İş InterruptedExceptionparçacığının atılması , iş parçacığının kesintiye uğramış durumunu temizler, böylece doğru şekilde ele alınmazsa bu bilgi kaybolur. Bu nedenle şunu çalıştırmayı öneriyorum:

} catch (InterruptedException e) {
  Thread.currentThread().interrupt();
  // code for stopping current task so thread stops
}

Bu durumu tekrar ayarlar. Bundan sonra yürütmeyi bitirin. Bu, hiç kullanılmamış olsa bile doğru davranış olacaktır.

Daha iyi olan şey şunu eklemektir:

} catch (InterruptedException e) {
  throw new RuntimeException("Unexpected interrupt", e);
}

... catch bloğuna ifade. Bu temelde bunun asla olmaması gerektiği anlamına gelir. Dolayısıyla kod, olabileceği bir ortamda yeniden kullanılırsa bundan şikayetçi olacaktır.


5
Java'daki onaylar varsayılan olarak kapalıdır . Bu yüzden bir RuntimeException.
Evgeni Sergeev


5

sleep()Ve wait()sınıfı gibi yöntemler Threadbir InterruptedException. Diğer bazı halinde ortaya çıkar threadkesmek istedi threadbekleyen veya uyku olduğunu.


3

Tek iş parçacıklı kodda işlemenin sağlam ve kolay bir yolu, onu her yöntem için bildirme ihtiyacından kaçınmak için onu yakalamak ve bir RuntimeException içinde geri almaktır.


-7

InterruptedExceptionBir uyku kesildiğinde genellikle atılır.


13
Bu yanlış, çünkü kesintiye uğrayan uykunun kendisi değil, onu çalıştıran İpliktir. Kesildi bir İş Parçacığı durumudur. Sadece uyku yönteminden çıkılmasına yol açar.
ubuntudroid
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.