2011-08-18 6 views
2

J'ai une situation pour exécuter thread1 toutes les minutes et thread2 toutes les heures. Comment puis-je faire ceci.Exécuter deux threads simultanément avec des temps de sommeil différents

actuellement j'ai un code de travail pour exécuter thread1 après chaque minute.

principale méthode

static void main(string args[]){ 
     orderListner thread1 = new orderListner(); 
     thread1.start(); 
    } 

thread1

public static void orderListner extends thread{ 
     public void run(){ 
     while(true){ 
      process(); 
      thread.sleep(60000); 
     } 
     } 
    } 

Maintenant, je dois commencer nouveau thread pour obtenir des résultats qui court après toutes les heures. comment je peux implémenter ceci simultanément (thread1 lancera continuellement thread2 devrait commencer chaque heure)

+2

Pourquoi ne pas utiliser deux minuteurs à la place? –

+0

Utilisez un masque de temps. Jetez un oeil ici http://download.oracle.com/javase/1.4.2/docs/api/java/util/TimerTask.html –

+0

Si vous pouvez le faire pour chaque minute, vous pouvez le faire pour chaque heure. Il suffit de multiplier le temps de sommeil par 60. Qu'est-ce qui me manque? S'il vous plaît expliquer ce que vous voulez faire plus explicitement. –

Répondre

1

Une meilleure façon d'utiliser la classe de thread est de créer un objet qui implémente Runnable au lieu d'étendre le thread. Si vous ne voulez pas créer un autre fichier, créez simplement une classe anonyme. (C'est une bonne habitude d'éviter d'utiliser l'héritage autant que possible.)

Cela étant dit, il suffit de créer un nouveau thread qui s'exécute sur l'heure et le démarrer. Je vais utiliser votre méthode de threads à la place.

static void main(string args[]){ 
      orderListner thread1 = new orderListner(); 
      orderListner2 thread2 = new orderListner2(); 
      thread1.start; 
      thread2.start; 
     } 

fil 1 est le même et le fil 2 est

public static void orderListner2 extends thread{ 
     void run(){ 
     while(true){ 
      process(); 
      thread.sleep(3600000); 
     } 
     } 
    } 
+0

S'il vous plaît corrigez-moi si je me trompe. dans la méthode principale, nous définissons thread1.start; cela signifie que le curseur ne retournera pas à cette classe jusqu'à ce que thread1 se termine, pour démarrer thread2. – gmeka

+0

Si vous prenez note des noms de méthodes définis dans la classe thread, et des méthodes appelées pour démarrer les classes de thread, elles ne sont pas identiques. le code du thread est défini dans une méthode appelée 'run', alors que le thread est réellement démarré en appelant une méthode nommée' start'. à l'intérieur de 'start', toutes sortes de magie noire sont invoquées, ce qui signifie que le code de votre méthode' run' est exécuté __separately__ à partir de l'autre code, et la méthode 'start' retourne à la main presque instantanément. après cela, le deuxième thread est démarré de la même manière sorcière;) – davogotland

+0

Dormir le fil n'est pas un bon moyen de planifier vos exécutions. Une meilleure façon est d'utiliser une minuterie ou un programmateur - regardez la réponse de @ mre. –

11

Je vous suggère d'utiliser un ScheduledExecutorService pour centraliser ces tâches.


public final class ScheduledExecutorServiceDemo { 
    private static final ScheduledExecutorService exec = 
     Executors.newScheduledThreadPool(2); 

    public static void main(String[] args){ 
     // Schedule first task 
     exec.scheduleAtFixedRate(new Runnable(){ 
      @Override 
      public void run() { 
       // do stuff 
      }}, 0, 1, TimeUnit.MINUTES); 

     // Schedule second task 
     exec.scheduleAtFixedRate(new Runnable(){ 
      @Override 
      public void run() { 
       // do stuff 
      }}, 0, 1, TimeUnit.HOURS); 
    } 
} 
+0

Cet exemple vous indique que wat doit être fait. http://gallemore.blogspot.com/2007/05/java-threading-scheduledexecutorservice.html Joyeux codage! – cheekoo

+0

@ user877333, Voir aussi: Didacticiel [Executors] (http://download.oracle.com/javase/tutorial/essential/concurrency/executors.html). – mre

2

bien fait jusqu'à présent! :)

vous pouvez simplement faire la même chose. ce que je veux dire par là est que vous créez une nouvelle classe qui représente votre deuxième thread (nous pouvons appeler cette classe SecondListener). il devrait ressembler à OrderListener, mais le temps de sommeil devrait être changé pour le rendre 1 heure.

alors vous venez de modifier votre méthode principale afin qu'elle crée un objet de la classe SecondListener, et démarre le thread, comme vous le faites avec le OrderListener.

S'il est important que SecondListener ne s'exécute pas, c'est la première fois qu'il s'exécute après une heure, vous pouvez exécuter sleep avant le processus dans SecondListener.

et enfin une petite suggestion sur les temps de sommeil: exprimez-les comme des équations pour des raisons de lisibilité. donc au lieu de 60000, tapez 1000 * 60. et au lieu de 3600000 tapez 1000 * 60 * 60 :)

+0

que se passe-t-il si la première méthode process() prend 50 secondes à s'exécuter? Le programme ci-dessus se comportera-t-il comme prévu? – cheekoo

+0

Exactement, je suis d'accord avec la lisibilité. – WillHaack

+0

@cheekoo Oui, cela fonctionnera encore, quand vous démarrez un nouveau thread, vous obtenez un nouveau processus.Vous avez 2 processus en cours d'exécution le second ne se soucie pas si le premier est fait. – WillHaack

Questions connexes