2017-02-02 1 views
0

J'expérimente un peu avec des Threads Java et j'essaie d'utiliser un Thread pour changer une variable appelée number dans ma classe par un Thread dans une autre classe.
Mais apparemment, ça ne marche pas, je reçois toujours le 0 à partir du moment où j'ai commencé ma valeur, peut-être que quelqu'un pourrait me dire pourquoi.Java Thread ne fonctionne pas

Ceci est ma première classe:

public class ThreadTest { 
public int number = 0; 
public static void main(String[] args) { 
    ThreadTest Adding = new ThreadTest(); 
    Adding.addingOnes(); 
    System.out.println(Adding.number); 
} 
public void addingOnes() { 
    Runnable thread1 = new ThreadClassPlus(); 
    Thread t1 = new Thread(thread1); 
    t1.start(); 
    try { 
    t1.join(); 
    } catch (InterruptedException e) { 
    e.printStackTrace(); 
    } 
} 
public void add() { 
    number++; 
} 
} 

Et ma deuxième classe pour la discussion:

public class ThreadClassPlus extends ThreadTest implements Runnable 
{ 
    public void run() 
    { 
    for(int i = 0; i < 10000; i++) 
    { 
     add(); 
    } 
    } 
} 
+0

Cela n'a jamais de sens de rejoindre un thread immédiatement après le démarrage ... Ok, peut-être que cela vous aidera à apprendre quelque chose sur les threads, mais cela n'aurait jamais de sens de le faire dans un vrai programme. –

Répondre

1

Le problème est que votre instance ThreadTest et votre instance ThreadClassPlus sont des objets différents. Votre thread incrémente number dans la dernière instance, mais votre méthode main lit la valeur de number de la première. Naturellement, le premier n'a pas la valeur de ce dernier.

Le filetage fonctionne correctement. Le problème est dans la façon dont vous l'utilisez.

Voici une version corrigée:

public class ThreadTest implements Runnable { 

    public int number = 0; 

    public static void main(String[] args) { 
     ThreadTest adding = new ThreadTest(); 
     adding.addingOnes(); 
     System.out.println(adding.number); 
    } 

    public void addingOnes() 
     Thread t1 = new Thread(this); 
     t1.start(); 
     try { 
      t1.join(); 
     } 
     catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void add() { 
     number++; 
    } 

    public void run() { 
     for(int i = 0; i < 10000; i++) { 
      add(); 
     } 
    } 
} 

S'il vous plaît noter attentivement les divers changements de style que j'ai fait. Le style Java est important.

0

Tout simplement parce que vous augmentez la valeur de la variable number appartenant à l'objet thread1, lors de l'impression valeur variable number appartenant à l'objet Adding.

Juste impression correcte valeur de la variable et vous verrez résultat attendu:

System.out.println(((ThreadClassPlus)thread1).number); 

Et BTW, s'il vous plaît, ne nommons pas les variables commençant par majuscules, c'est un style très mauvais: A dding =>une dding.