Catch InterruptedException Error
Sila semak coretan kod di bawah:
public class Task implements Runnable { private final BlockingQueue queue = ...; @Override public void run() { while (!Thread.currentThread().isInterrupted()) { String result = getOrDefault(() -> queue.poll(1L, TimeUnit.MINUTES), "default"); //do smth with the result } } T getOrDefault(Callable supplier, T defaultValue) { try { return supplier.call(); } catch (Exception e) { logger.error("Got exception while retrieving value.", e); return defaultValue; } } }
Masalah dengan kod ialah semasa menunggu elemen baharu dalam baris gilir , adalah mustahil untuk menamatkan rangkaian kerana bendera yang terganggu tidak pernah dipulihkan:
1.
2.BlockingQueue # Kaedah poll() membuang InterruptedException dan mengosongkan bendera interrupt.
3. Penghakiman keadaan gelung (!Thread.currentThread().isInterrupted()) dalam while adalah benar kerana tanda telah dikosongkan.
Untuk mengelakkan tingkah laku ini, sentiasa tangkap apabila kaedah dilemparkan secara eksplisit (dengan mengisytiharkannya sebagai membuang InterruptedException) atau secara tersirat (dengan mengisytiharkan/melemparkan pengecualian primitif) InterruptedException dan memulihkan bendera yang terganggu.
T getOrDefault(Callable supplier, T defaultValue) { try { return supplier.call(); } catch (InterruptedException e) { logger.error("Got interrupted while retrieving value.", e); Thread.currentThread().interrupt(); return defaultValue; } catch (Exception e) { logger.error("Got exception while retrieving value.", e); return defaultValue; } }
Atas ialah kandungan terperinci Bagaimana untuk menangkap ralat InterruptedException dalam java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!