Rumah > Java > javaTutorial > Bagaimana untuk menangkap ralat InterruptedException dalam java

Bagaimana untuk menangkap ralat InterruptedException dalam java

WBOY
Lepaskan: 2023-04-18 20:10:34
ke hadapan
900 orang telah melayarinya

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;
		}
	}
}
Salin selepas log masuk

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;
	}
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk menangkap ralat InterruptedException dalam java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan