2009-05-27 9 views
2

Je me demande comment je peux appeler une classe à partir de différents threads et si tous les appels sont exécutés dans son propre thread? Disons que j'ai trois threads, et chacun d'eux doit appeler anotherClass.getBS(), mais les appels peuvent venir en même temps, et il n'y a aucune raison de les exécuter un à la fois. Les deadlocks ne sont pas un problème.Démarrage d'une classe Java dans différents threads

Merci!

Répondre

7

Si anotherClass.getBS() est réellement thread-safe, vous pouvez l'appeler à partir de chacun de vos trois threads. Il va fonctionner dans le fil que vous l'avez appelé.

Un petit exemple de ceci en action. Le code ci-dessous produit cette sortie:

$ javac Bar.java 
$ java Bar 
Thread ID 9 running 
Thread ID 10 running 
Thread ID 8 running 
Doing something on thread 9 
Doing something on thread 10 
Doing something on thread 8 
Thread ID 9 running 
Doing something on thread 9 
Thread ID 8 running 
Doing something on thread 8 
Thread ID 10 running 
Doing something on thread 10 

Voici le code:

public class Bar 
{ 

    static private final class MyOtherClass 
    { 
    public void doSomething() 
    { 
     System.out.println("Doing something on thread "+Thread.currentThread().getId()); 
    } 
    } 

    static private MyOtherClass myOtherClass=new MyOtherClass(); 

    static private final class MyThreadClass implements Runnable 
    { 
    public void run() 
    { 
     while (true) 
     { 
     try 
     { 
      Thread.sleep(1000); 
     } 
     catch (InterruptedException ie) 
     { 
      System.err.println("Interrupted"); 
      return; 
     } 
     System.out.println("Thread ID "+Thread.currentThread().getId()+" running"); 
     myOtherClass.doSomething(); 
     } 
    } 
    } 

    static public void main(String[] args) 
    { 
    Thread t1=new Thread(new MyThreadClass()); 
    Thread t2=new Thread(new MyThreadClass()); 
    Thread t3=new Thread(new MyThreadClass()); 
    t1.start(); 
    t2.start(); 
    t3.start(); 
    } 

} 
2

Si vous êtes sûr que la méthode getBS() n'a pas de problèmes de concurrence il suffit d'appeler la méthode normalement.

Si la méthode est static faire juste:

AnotherClass.getBS(); 

autre

passer une référence de anotherClass obj à chaque thread:

class MyThread extends Thread { 
    private AnotherClass anotherClass; 

    MyThread(AnotherClass anotherClass) { 
     this.anotherClass= anotherClass; 
    } 

    public void run() { 
     anotherClass.getBS(); 
    } 
} 


MyThread p = new MyThread(anotherClass); 
p.start(); 
+0

Le questionneur semble avoir assez de difficulté à travailler ce un fil est sans prolonger le fil. –

+0

Pourquoi le vote baissier ??? –

+0

Aucune idée qui vous a rabaissé et pourquoi, mais votre réponse est également bonne afaics. –

Questions connexes