2010-07-05 6 views
2

J'ai une classe qui commence un nouveau thread en appelanten cours plus de 2 fils à l'intérieur 1 classe

public void omnom(){ 
    t = new Thread(this, "My Thread"); 
    t.start(); 
} 

Le nouveau fil passe alors à l'intérieur de la méthode run(). J'ai donc deux threads fonctionnant bien mais comment pourrais-je ajouter un troisième? Je voudrais "séparer" 2 fils, par exemple t.start(); + f.start(); comment les séparer de omnom() et les envoyer à 2 méthodes différentes "run()"?

Merci!

+0

Aidan, pourriez-vous préciser ce que vous entendez par "2 méthodes' run() 'différentes"? J'ai remarqué que Bozho avait posté une réponse plus simple que la mienne, mais l'a effacée plus tard. Sa réponse peut être la bonne, selon la façon dont vous vouliez dire votre formulation. –

Répondre

4

Vous pouvez créer une classe Runnable anonyme pour appeler toute méthode « run » que vous préférez:

public void omnom() { 
    new Thread(this, "My Thread").start(); 
    new Thread(
      new Runnable() { 
       public void run() { 
        otherRunMethod(); 
       } 
      } 
     ).start(); 
} 
0

En répétant simplement le new Thread() et le start().

Vous devez distinguer la structure de compilation de la structure d'exécution. Vous pouvez avoir autant de threads en utilisant le même code de byte que vous le souhaitez, et ils vont heureusement exécuter n'importe quelle partie de la classe pour leur flux d'exécution privé - même s'il s'agit de la même ligne de code exécutée par un autre thread!

(En fait, c'est toute raison pour laquelle la programmation concurrente est si complexe, et pourquoi la synchronisation est même nécessaire: car le bytecode est pas appartenant à un fil particulier, mais par un classloader.)

1

Lorsque vous créez le thread, vous passez une instance de Runnable en tant que premier paramètre - et c'est la méthode run() de ce runnable qui est appelée par le thread. Donc, dans votre cas spécifique, vous passez en this - probablement la classe que vous appelez implémente Runnable et a une méthode run(), c'est pourquoi cette méthode est appelée par le thread t. Pour avoir un autre thread f appeler une autre méthode, vous aurez simplement besoin de passer une autre instance de Runnable dans le constructeur du thread qui a la méthode différente run(), quelque chose comme ceci:

public void omnom(){ 
    Thread t = new Thread(this, "My Thread"); 
    t.start(); 

    // Get this Runnable from somewhere, possibly pass it in as a method 
    // parameter/construct it explicitly here/whatever 
    Runnable fRunner = ...; 
    Thread f = new Thread(fRunner, "My Other Thread"); 
    f.start(); 
} 
Questions connexes