IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Concurrence et multi-thread Java Discussion :

Gerer les exceptions des Threads


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 193
    Par défaut Gerer les exceptions des Threads
    Bonjour,
    Je dois faire un programme qui verifie la disponibilité et le bon fonctionnement d'un outil :
    Soit TraitementLong la classe qui fait tous les tests.

    L'un des problème que je dois gérer est la mauvaises prise en compte de TraitementLong des TimeOut.

    Pour cela je crée un Thread qui lance un TimeOut en même qu'un thread qui qui lance TraitementLong.


    Voila le code :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
     
    package ppaceMaker;
     
    import org.apache.log4j.Logger;
    import org.apache.log4j.PropertyConfigurator;
     
    import utilities.Mailing;
    import utilities.PPlus;
    import utilities.Utils;
    import utilities.Timer;
     
    import com.sciforma.psnext.api.PSException;
     
    public class ConnectionDiagnosis_V5 extends Timer {
     
    	static final long start = System.currentTimeMillis();
     
    	static long now = start;
     
    	final boolean OK = true;
     
    	private static int TIME_OUT = 5;
     
    	private static final Logger logger = Logger.getLogger("PACEMAKER");
     
    	static boolean timeOut = false;
     
    	static boolean success = false;
     
    	public ConnectionDiagnosis_V5(int arg0) {
    		super(arg0);
    		// TODO Auto-generated constructor stub
    	}
     
    	private synchronized static void lanchtest() throws PSException {
    		PPlus mytest = new PPlus(true, true);
    		mytest.closeSession();
    	}
     
    	static Thread tpplus = new Thread(new Runnable() {
    		public void run() {
    			// le code qui te prend du temps
    			try {
    				lanchtest();
    				success = true;
    				tcounter.interrupt();
    			} catch (Exception e) {
    				e.printStackTrace(); // eventuelle
    			}
    		}
    	});
     
    	static Thread tcounter = new ConnectionDiagnosis_V5(TIME_OUT * 1000);
     
    	synchronized public void timeout() {
    		System.err.println("ICI?");
    		// Erreur de TO
    		logger.error("PPlus Timeout occurred.... terminating");
    		tpplus.interrupt();
    		timeOut = true;
    		this.stop();
    	}
     
    	public static void checkJobDate() {
     
    	}
     
    	public static void main(java.lang.String[] args) {
     
    		PropertyConfigurator.configure(ConnectionDiagnosis.class
    				.getClassLoader().getResource("conf/log4j.properties"));
    		logger.info("Starting Diagnosis");
     
    		tcounter.start();
    		tpplus.start();
     
    		while (!timeOut) {
     
    		}
     
    		logger.info("Ending Diagnosis");
    		Utils.timeIt(start);
    	}
    }

  2. #2
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 193
    Par défaut
    Mon problème est simple:


    Comment récupérer les interruptions de Thread (java.lang.InterruptedException) pour pouvoir lancer le traitement voulu. Dans mon cas :

    Si Time out se produit : Tuer Thread et Envoyer Mail depuis le Main.


    Il est à noter que les 2 threads doivent s'interrompre , en effet :
    Si TraitementLong < TimeOut alors je dois tuer TimeOut et envoyer un mail positif

    TraitementLong > TimeOut alors je dois tuer TimeOut et envoyer un mail négatif

  3. #3
    Membre chevronné Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Par défaut
    Il faut organiser tes threads de façon à ce qu'ils sortent de la méthode run sur réception de l'exception InterruptedException.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public void run()
    {
     try
     {
      ...
     }
     catch (InterruptedException hum)
     {
      // rien :-)
     }
    }
    À noter que l'on ne tue pas un thread en java. En java, un thread se termine tranquillement. Si on veut le tuer poliment, alors on l'interrompt, puis il se termine.

    Voir Interrupts.

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 193
    Par défaut
    J'ai un problème avec l'elegante methode "interrupt" qui à mon sens est trop polie pour la très "desinvolte" API que j'utilise...
    Elle ne comprend que le stop()...
    J'utilise join() finalement pour atendre le TimeOut.

    Voila mon code temporaire (qui n'est pas bon) en attendant que vous m'aidiez


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
     
    package ppaceMaker;
     
    import org.apache.log4j.Logger;
    import org.apache.log4j.PropertyConfigurator;
     
    import utilities.TraitementLong;
    import utilities.Utils;
     
    import com.sciforma.psnext.api.PSException;
     
    public class ConnectionDiagnosis_V6 {
     
    	static final long start = System.currentTimeMillis();
     
    	static long now = start;
     
    	final boolean OK = true;
     
    	private static int TIME_OUT = 10;
     
    	private static final Logger logger = Logger.getLogger("PACEMAKER");
     
    	static boolean timeOut = false;
     
    	static boolean success = false;
     
    	private synchronized static void lanchtest() throws InterruptedException,
    			PSException {
    		TraitementLong mytest = new TraitementLong(true, true);
    		mytest.closeSession();
    	}
     
    	static Thread tTraitementLong = new Thread(new Runnable() {
    		public void run() {
    			// le code qui te prend du temps
    			try {
    				lanchtest();
    				success = true;
    			} catch (InterruptedException Ie) {
    				System.err.println("LA0");
    				Ie.printStackTrace(); // jamais
    			} catch (PSException pse) {
    				System.err.println("LA1");
    				pse.printStackTrace(); // interruption
    			} catch (Exception e) {
    				System.err.println("LA2");
    				e.printStackTrace(); // eventuelle
    			}
    		}
    	});
     
    	public static void checkJobDate() {
     
    	}
     
    	public static void main(java.lang.String[] args) {
     
    		PropertyConfigurator.configure(ConnectionDiagnosis.class
    				.getClassLoader().getResource("conf/log4j.properties"));
    		logger.info("Starting Diagnosis");
     
    		tTraitementLong.start();
     
    		try {
    			tTraitementLong.join(TIME_OUT * 1000);
    			if (tTraitementLong.isAlive()) {
    				// Fin Echec
    				tTraitementLong.interrupt();
    				//tTraitementLong.stop();
    				System.err.println("Echec TimeOut");
    			} else {
    				// Fin Succes
    				if (success) {
    					System.out.println("Reussite");
    				}
     
    			}
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    			System.err.println("LA3");
    		} catch (Exception ex) {
    			ex.printStackTrace();
    			System.err.println("LA4");
    		}
     
     
    		System.out.println("HERE");
     
    		logger.info("Ending Diagnosis");
    		Utils.timeIt(start);
    	}
    }

  5. #5
    Membre chevronné Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Par défaut
    Si l'API que tu utilises traite mal interrupt, tu es un peu coincé. Interrupt est prévu pour les persones polies, c'est tout. Les autres sont deprecated .

    Mais la meilleure solution est de faire l'effort d'être poli avec les deprecated ; à toi de te surpasser !

Discussions similaires

  1. [CR ?] gerer les propriétés des objets via les formules?
    Par Flamby38 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 25/06/2008, 18h01
  2. TQuery les exceptions des erreurs?
    Par delphino7 dans le forum Bases de données
    Réponses: 2
    Dernier message: 30/03/2008, 12h49
  3. Gerer les exceptions
    Par pham1980 dans le forum Struts 2
    Réponses: 7
    Dernier message: 14/01/2008, 22h33
  4. Gérer les exceptions sous devc++
    Par nico49 dans le forum Dev-C++
    Réponses: 7
    Dernier message: 06/01/2006, 14h57
  5. [Exception]Comment gérer les exceptions ?
    Par Gildas Huart dans le forum Général Java
    Réponses: 7
    Dernier message: 29/03/2005, 19h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo