[Java] Thread & Exception

Thread & Exception [Java] - Java - Programmation

Marsh Posté le 22-05-2007 à 14:34:29    

Voila, j'instancie plusieurs threads de cette manière :
 

Code :
  1. try {
  2.         javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
  3.          public void run() {
  4.           MonThread monThread = new MonThread();
  5.          }
  6.         });
  7. } catch (Exception e) {
  8.         System.err.println("Thread didn't successfully launch" );
  9. }


 
Ils discutent entre eux, gèrent des process de manière asynchrone, ils font leur boulot de thread quoi. :o
 
Ce qui me pose problème c'est que j'aimerais centraliser les remontées d'exceptions
 
Prenons un exemple :
 
Une méthode A, de thread A, appelle la méthode B de Thread B.
Thread B fait son boulot, et pouf jette une exception, elle remonte jusqu'à la méthode B qui a été appelé, puis elle continue son chemin jusqu'à la méthode A de Thread A.
 
Si je veux la gérer, il faut que ça soit Thread A qui le fasse. Or imaginons que Thread B veuille appeler une méthode de Thread A, la il faut que ça soit Thread B qui gère les exception... Enfin, impossible de centraliser la gestion d'erreur :/
 
Quelqu'un à une idée?


---------------
Profil strava
Reply

Marsh Posté le 22-05-2007 à 14:34:29   

Reply

Marsh Posté le 27-05-2007 à 03:49:23    

Salut;
 
Ah la pb classique de communication entre les threads...
 
Une façon que je trouve pratique pour permettre à un thread pour faire passer des objets à un autre thread est l'usage tube (pipe) entre les threads. Un pipe est un canal de communication où des threads écrivent via un PipedWriter int ou des objets (comme une String avec un message d'erreur dans les blocks catch...)via un buffer et un (ou plusieurs) autre les récupèrent avec un PipedReader (dont les méthodes read bloquent le thread lecteur jusqu'à ce qu'un writer envoie quelque chose...)
 
pour ce faire avant de lancer tes theads (après le premier try de ton exemple), rajoute
 
 
 
PipedReader pRead = new PipedReader () ;
PipedWriter  pWrite = new PipedWriter(pRead);
 
Note le fait que l'un reçoit l'autre un param pour les conecter...  
 
Il faut que le(s) process qui génèrent les exceptions reçoit un pipedwriter (par exemple, déclare des classes héritant de Thread dont le constructeur reçoit un PipedWriter  et le "sauve" dans un champ de classe) Ainsi, dans les catch des méthodes de ce thread, fais des  
 
write(0 /*cad un int*/);
ou utilise des write(char[] cbuf,
                  int off,
                  int len)
ou + simple  avec le jdk 5.0 write(String s)  // que je te conseille...
pour passer des objets .
 
Ton thread père, que tu nommes "A" plus haut fera alors une boucle :
 
int i = 0;
while (true) {
  try {
    i = pw.read();
    System.out.println("reçu = " +i);
    // pour le write(int) de laaut cote, passe un tableau de char pour récupérer la string...
  } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}
 
 
Note que cela veut dire que la thread A est alors dédié au traitement des réceptions, si c'est le thread de ton IHM, délègue le traitement des erreurs à un autre thread (à qui tu passera un param une zone de ton IHM où afficher l'erreur par exemple) ou à défaut passe par un Exchanger.
 
Bonne chance...
 
 
L'i

Reply

Marsh Posté le 20-11-2010 à 11:11:59    

Déterrage de topic, certes, mais comme il est intéressant. J'ai lu effectivement des choses sur les "Pipe", mais il faut effectivement éviter le blocage de l'IHM et donc le problème reste entier.
 
Je ne suis pas très fan du délègue le traitement des erreurs à un autre thread (à qui tu passera un param une zone de ton IHM où afficher l'erreur, en revanche, j'aimerais en savoir + sur le Exchanger... quoi t'est-ce que ça ?
 
Merci d'avance pour vos réponses.


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed