Maison > Java > javaDidacticiel > Comment intercepter l'erreur InterruptedException en Java

Comment intercepter l'erreur InterruptedException en Java

WBOY
Libérer: 2023-04-18 20:10:34
avant
896 Les gens l'ont consulté

Catch InterruptedException Error

Veuillez vérifier l'extrait de code ci-dessous :

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;
		}
	}
}
Copier après la connexion

Le problème avec le code est qu'il n'est pas possible de terminer le thread en attendant un nouvel élément dans la file d'attente car l'indicateur interrompu n'est jamais restauré :

1. Le thread exécutant le code est interrompu.
2.BlockingQueue # La méthode poll() lève InterruptedException et efface l'indicateur d'interruption.
3.Le jugement de la condition de boucle (!Thread.currentThread().isInterrupted()) dans while est vrai car la marque a été effacée.

Pour éviter ce comportement, lorsqu'une méthode est lancée explicitement (en la déclarant pour lancer une InterruptedException) ou implicitement (en déclarant/en lançant une exception brute), interceptez toujours l'exception InterruptedException et reprenez le signe d'interruption.

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;
	}
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal