L'authenticator par défaut est écrasé dans chaque thread et il arrive que le thread X utilise l'authenticator définit pour le thread Y ... pas cool, cela m'a valu une séance d'arrachage de cheveux pour comprendre le souci. Il y a une astuce pour contourner ce problème. Il faut remplacer l'authenticator par un setRequestProperty afin que chaque appli utilise l'authentification qui lui est associée.

Dans mon cas, il s'agit uniquement de définir correctement la request property "Authorization" ... le principe reste le même si il s'agit de la property "Proxy-Authorization"...

Voici comment j'ai résolu mon problème :

Code avant :

URL url = new URL ("http://mon url");
Authenticator.setDefault(monAuthenticator);
HttpURLConnection cnx = (HttpURLConnection) url.openConnection();

Code après :

URL url = new URL ("http://mon url");
HttpURLConnection cnx = (HttpURLConnection) url.openConnection();
cnx.setRequestProperty("Authorization"
	, getBasic("mon login","mon password"));

et

private String getBasic(String user, String password) {
	String authBasic = "Basic ";
	try {
		String userpass = user + ":" + password;
		authBasic += new sun.misc.BASE64Encoder()
			.encode(userpass.getBytes());
	} catch(Exception e) {
		e.printStackTrace();
	}
	return authBasic;
}

Ce code n'est peut être pas la manière la plus élégante de régler le problème, mais au moins il corrige ce problème de mélange d'authenticator.