2009-09-01 4 views
0

Je pense avoir un problème de synchronisation ... Il peut aussi basic..Please aide ..Java Multi problème de synchronisation de thread?

J'ai un fil de la méthode d'exécution dont est inférieure à

public void run() 
    { 
     while(true) 
     { 
      try { 
       for (int i = 0; i < 100; i++) { 
        buf.append(hello + (myint++)); 
       } 
       buf.append("\n"); 
       adapter.setData(buf.toString()); 
       buf = null; 
       buf = new StringBuffer(); 
       Thread.sleep(1000); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(TestThread.class.getName()).log(Level.SEVERE, null, ex); 
      } 

     } 

Je crée une nouvelle chaîne données dans chaque course et le passage à la méthode de la classe adaptateur setData ..

dans la classe d'adaptateur mon setData est comme ça ..

public boolean setData(String sb){ 

     str = sb; 
     if(str != null && !str.equalsIgnoreCase("")){ 
      timer.scheduleAtFixedRate(new TimerTask() { 
       public void run() { 


          System.out.println("inside run....."); 
         System.out.println("str length:- "+str.length()); 
           //do sth after this.. 

           } 
        } 

Bu t une fois de temps en temps j'obtiens une exception de pointeur null à la ligne str.length() ... Je reçois cela même quand j'essaye de créer une nouvelle chaîne avec le buf.toString() dans la première méthode d'exécution ..

Qu'est-ce que je fais mal ??

Merci à l'avance ..

Répondre

2

C'est parce que la str est une variable de classe. Si vous ne disposez pas d'une raison d'utiliser une autre référence pour sb, essayez ceci:

public boolean setData(final String str){ 

     if(str != null && !str.equalsIgnoreCase("")){ 
       timer.scheduleAtFixedRate(new TimerTask() { 
       public void run() { 


          System.out.println("inside run....."); 
           System.out.println("str length:- "+str.length()); 
           //do sth after this.. 

           } 
        } 
0

Le problème est que vous ne se synchronisent pas du tout. Par exemple, le champ "str" ​​est lu à partir d'un thread et mis à jour simultanément à partir d'un autre thread, sans aucune synchronisation.

(Il serait utile si vous montriez un complet et runnable exemple au lieu de seulement les parties vous paraissent intéressants.)

2

Ce que vous faites mal est ceci: le buf et str sont apparemment à la fois instance ou les champs statiques accédés non synchronisés par plusieurs threads.

Il semble presque que vous ne connaissiez pas le concept de local variables. Il semble que les deux buf et str pourraient être des variables locales (et str remplacé par le paramètre de méthode sb). Essayez de changer votre code à ceci:

public void run() 
{ 
    while(true) 
    { 
     try { 
      StringBuffer buf = new StringBuffer(); 
      for (int i = 0; i < 100; i++) { 
       buf.append(hello + (myint++)); 
      } 
      buf.append("\n"); 
      adapter.setData(buf.toString()); 
      Thread.sleep(1000); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(TestThread.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 

public boolean setData(String str){ 
    if(str != null && !str.equalsIgnoreCase("")){ 
     timer.scheduleAtFixedRate(new TimerTask() { 
     public void run() { 
      System.out.println("inside run....."); 
      System.out.println("str length:- "+str.length()); 
      //do sth after this.. 
     } 
    } 

et enlever les déclarations d'instance ou de classe de buf et str. Si vous en avez vraiment besoin en dehors des méthodes, essayez de le faire via des valeurs de retour ou, si tout le reste échoue, utilisez synchronization.

+0

Merci pour votre réponse. déclarant str comme finale aidé comme indiqué ci-dessous..J'en ai besoin dans la classe intérieure –

+1

Ce n'est pas le "final" qui a aidé! Il est en train de changer pour une variable locale qui l'a fait. –

0

Essayez d'utiliser méthodes get et set pour la "str" ​​qui sera synchronisé à l'aide d'un objet syncronization:

private static Object syncObject = new Object(); 
public String getStr(){ 
    synchronized (syncObject){ 
    return str; 
    } 
} 
public void setStr(String value){ 
    synchronized (syncObject){ 
    str = value; 
    } 
} 

Et insted:

str=sb; 

essayer:

setStr(sb); 

et insta:

System.out.println("str length:- "+str.length()); 

essayer: System.out.println("str length:- "+getStr().length());

Questions connexes