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

Java Discussion :

Thread et erreur StackOverflowError


Sujet :

Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Par défaut Thread et erreur StackOverflowError
    Bonjour,

    J'ai un soucis avec un Thread qui execute une action toutes les n secondes. Au bout d'une heure j'ai une erreur StackOverflowError. Je vous met ci dessous l'erreur complete :

    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
    Exception in thread "Thread-5" java.lang.StackOverflowError
    	at sun.awt.SunToolkit.isInstanceOf(Unknown Source)
    	at sun.awt.SunToolkit.isInstanceOf(Unknown Source)
    	at sun.awt.SunToolkit.isInstanceOf(Unknown Source)
    	at sun.awt.SunToolkit.isInstanceOf(Unknown Source)
    	at sun.awt.SunToolkit.isInstanceOf(Unknown Source)
    	at sun.awt.SunToolkit.isInstanceOf(Unknown Source)
    	at sun.awt.SunToolkit.isInstanceOf(Unknown Source)
    	at sun.awt.SunToolkit.isInstanceOf(Unknown Source)
    	at javax.swing.LookAndFeel.installProperty(Unknown Source)
    	at javax.swing.plaf.basic.BasicLabelUI.installDefaults(Unknown Source)
    	at javax.swing.plaf.basic.BasicLabelUI.installUI(Unknown Source)
    	at javax.swing.JComponent.setUI(Unknown Source)
    	at javax.swing.JLabel.setUI(Unknown Source)
    	at javax.swing.JLabel.updateUI(Unknown Source)
    	at javax.swing.table.DefaultTableCellRenderer.updateUI(Unknown Source)
    	at javax.swing.JLabel.<init>(Unknown Source)
    	at javax.swing.JLabel.<init>(Unknown Source)
    	at javax.swing.table.DefaultTableCellRenderer.<init>(Unknown Source)
    	at AlerteRenderer.<init>(Fenêtre.java:1668)
    	at Clignote.run(Clignotement.java:38)
    	at Clignote.run(Clignotement.java:44)
    	at Clignote.run(Clignotement.java:44)
    	at Clignote.run(Clignotement.java:44)
    	at Clignote.run(Clignotement.java:44)
    	at Clignote.run(Clignotement.java:44)
    	at Clignote.run(Clignotement.java:44)
    	at Clignote.run(Clignotement.java:44)
    	at Clignote.run(Clignotement.java:44)
    	at Clignote.run(Clignotement.java:44)
    	at Clignote.run(Clignotement.java:44)
    	at Clignote.run(Clignotement.java:44)
    	at Clignote.run(Clignotement.java:44)
    	at Clignote.run(Clignotement.java:44)
    	at Clignote.run(Clignotement.java:44)
    	at Clignote.run(Clignotement.java:44)
    	at Clignote.run(Clignotement.java:44)
    	at Clignote.run(Clignotement.java:44)
    ....
    L'objet Clignote est le suivant :
    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
    class Clignote extends Thread implements Serializable
    {
    	/**
             * 
             */
    	private static final long serialVersionUID = 6461023223800616133L;
     
    	public void run()
    	{
      		for(int i=0;i<AlerteRenderer.correspondancesAlertes.size();i++)
      		{
    	  		if(AlerteRenderer.correspondancesClign.get(i)==true)
    	  		{
    			    if(AlerteRenderer.correspondancesAlertes.get(i)==Color.white)
    	    		  AlerteRenderer.correspondancesAlertes.set(i, AlerteRenderer.correspondancesEnre.get(i));
    	    	    else
    	    		  AlerteRenderer.correspondancesAlertes.set(i, Color.white);
    	  		}
    	  	}
      		  PanEsp.ale.setDefaultRenderer(Object.class,new AlerteRenderer());
    		  PanEsp.ale.repaint();
     
    		  try {
    	        // pause
    	        Thread.sleep(1000);
    	      run();
    	      }
    	      catch (InterruptedException ex) {}
     
    	}
    }
    Je me demande si ça n'a pas un rapport au fait que le nombre de Thread soit limité par Java. En fait au début tout va bien, ça n'est qu'au bout d'un certains temps d'utilisation que l'erreur survient et je pense que c'est par ce que la fonction run se rappelle 36 fois mais comment faire cela proprement alors ?

  2. #2
    Membre émérite Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Par défaut
    oui, au lieu de rappeller run depuis elle-même, fais plutot une boucle genre "while (alive)", avec une méthode qui met alive à false quand tu veux arrêter la boucle.

    Le problème ne vient pas des limites Java, mais de la mémoire : à partir du moment où tu ne cesse d'appeller une méthode depuis elle-même, la mémoire se remplit et tôt ou tard sature.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [threads]étrange erreur à la compilation.
    Par méphistopheles dans le forum Boost
    Réponses: 3
    Dernier message: 02/06/2009, 18h22
  2. [2.3.0] Erreur StackOverFlowError
    Par Dido90 dans le forum BIRT
    Réponses: 3
    Dernier message: 06/03/2009, 11h50
  3. [Thread] une erreur dans un de nos tuto?
    Par TheBlackReverand dans le forum C#
    Réponses: 5
    Dernier message: 15/06/2008, 19h21
  4. [thread][socket]Erreur connection déconnection
    Par Invité(e) dans le forum C++
    Réponses: 1
    Dernier message: 03/03/2008, 20h33
  5. [threading][logging] erreur de loggage dans un thread
    Par Guigui_ dans le forum Général Python
    Réponses: 5
    Dernier message: 12/10/2005, 15h01

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