Kapan Thread.sleep Java menampilkan InterruptedException?

110

Kapan Thread.sleep Java menampilkan InterruptedException? Apakah aman untuk mengabaikannya? Saya tidak melakukan multithreading. Saya hanya ingin menunggu beberapa detik sebelum mencoba kembali beberapa operasi.

Manki
sumber
1
Tergantung dalam arti apa yang Anda maksud "mengabaikan". InterruptedExceptionadalah pengecualian tertangkap, sehingga Anda tidak dapat mengkompilasi kecuali jika Anda menangani atau menyatakan jenis ini pengecualian pada setiap metode yang bergabung atau tidur satu Thread, atau panggilan wait()pada Object.
8bitjunkie

Jawaban:

41

Biasanya Anda TIDAK boleh mengabaikan pengecualian. Perhatikan kertas berikut ini:

Jangan menelan sela

Terkadang melempar InterruptedException bukanlah pilihan, seperti saat tugas yang ditentukan oleh Runnable memanggil metode interruptible. Dalam kasus ini, Anda tidak dapat menampilkan kembali InterruptedException, tetapi Anda juga tidak ingin melakukan apa pun. Saat metode pemblokiran mendeteksi interupsi dan melontarkan InterruptedException, ini menghapus status terputus. Jika Anda menangkap InterruptedException tetapi tidak dapat mengembalikannya, Anda harus menyimpan bukti bahwa interupsi terjadi sehingga kode yang lebih tinggi pada tumpukan panggilan dapat mempelajari interupsi dan menanggapinya jika diinginkan. Tugas ini diselesaikan dengan memanggil interrupt () ke "reinterrupt" utas saat ini, seperti yang ditunjukkan pada Listing 3. Paling tidak, setiap kali Anda menangkap InterruptedException dan tidak memutar ulang, hentikan ulang utas saat ini sebelum kembali.

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();
         }
    }
}

Lihat seluruh makalah di sini:

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

Benny Bottema
sumber
38

Jika an InterruptedExceptiondilempar itu berarti ada sesuatu yang ingin mengganggu (biasanya menghentikan) utas itu. Ini dipicu oleh panggilan ke interrupt()metode utas . Metode menunggu mendeteksi itu dan melemparInterruptedException sehingga kode tangkapan dapat menangani permintaan penghentian segera dan tidak harus menunggu sampai waktu yang ditentukan habis.

Jika Anda menggunakannya di aplikasi single-threaded (dan juga di beberapa aplikasi multi-thread), pengecualian itu tidak akan pernah terpicu. Mengabaikannya dengan klausa tangkap kosong, saya tidak akan merekomendasikan. Pelemparan akan InterruptedExceptionmenghapus status terputus dari utas, jadi jika tidak ditangani dengan benar info tersebut akan hilang. Oleh karena itu saya akan mengusulkan untuk mencalonkan diri:

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

Yang menetapkan keadaan itu lagi. Setelah itu, selesaikan eksekusi. Ini akan menjadi perilaku yang benar, bahkan tangguh tidak pernah digunakan.

Yang mungkin lebih baik adalah menambahkan ini:

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

... pernyataan ke blok tangkap. Itu pada dasarnya berarti bahwa itu tidak boleh terjadi. Jadi jika kode tersebut digunakan kembali di lingkungan di mana hal itu mungkin terjadi, ia akan mengeluh tentangnya.

Kristen
sumber
5
Pernyataan di Java dinonaktifkan secara default . Jadi lebih baik melempar saja RuntimeException.
Evgeni Sergeev
11

Newsletter Java Specialists (yang dapat saya rekomendasikan tanpa syarat) memiliki artikel menarik tentang ini , dan cara menangani file InterruptedException. Ini sangat berharga untuk dibaca dan dicerna.

Brian Agnew
sumber
1
Apa yang dikatakan?
theonlygusti
5

Metode seperti sleep()dan wait()kelas Threadmungkin melempar InterruptedException. Ini akan terjadi jika ada orang lain yang threadingin mengganggu threadyang sedang menunggu atau tidur.

pengguna7805041
sumber
3

Cara yang solid dan mudah untuk menanganinya dalam kode utas tunggal adalah dengan menangkapnya dan memasukkannya kembali dalam RuntimeException, untuk menghindari keharusan mendeklarasikannya untuk setiap metode.

starblue
sumber
-7

The InterruptedExceptionbiasanya dilemparkan ketika tidur terganggu.

BrutalOst
sumber
13
Itu salah, karena bukan sleep itu sendiri yang diinterupsi, tetapi Thread yang menjalankannya. Terganggu adalah status Thread. Itu hanya mengarah ke metode tidur yang keluar.
ubuntudroid