2014-02-19 14 views
5

Ist es eine gute Übung, einen Thread innerhalb eines Threads zu starten? Ich habe gesucht, aber nicht viele Informationen gefunden.Erstellen Sie einen Thread innerhalb eines Threads - gute Praxis?

Ich habe eine TimerTask, die eine Liste von Benutzern jeden Tag zu einer bestimmten Zeit erhält. Ich möchte dann einige Daten über den Benutzer erhalten, aber dies erfordert Benutzereingaben. Da es Benutzereingaben erfordert, möchte ich nicht, dass mein TimerTask-Thread blockiert wird, wenn Benutzer nicht antworten. Beispielsweise reagiert der erste Benutzer in der Liste möglicherweise nicht in X Zeit, ich möchte X Zeit nicht warten, bis ich den zweiten Benutzer nach ihren Daten frage, und so weiter. In meiner TimerTask erstelle ich einen neuen Thread und starte ihn, um die Daten zu erhalten. Auf diese Weise kann ich in Y Zeit, wenn ich einige Daten erhalten habe (aber nicht alle), immer noch andere Dinge tun, anstatt auf jeden einzelnen zu warten.

Ist es eine gute Übung, das oben genannte zu tun? Gibt es bessere Lösungen?

Hier ist etwas psudeo Code, der Ihnen helfen kann, zu verstehen.

class UserThread extends TimerTask { 

     @Override 
     public void run() { 
      log.debug("Get a list of members!"); 
      List<String> users = userManager.getUsers(); 
      retrieveInitialData(users); 
     } 

     public void retrieveInitialData(List<String> users) { 
      for(String user : users) { 
       new Thread(new GetData(user)).start(); 
      } 
     } 

     addToSuccessList(String user) { 
      synchronized(successList) { 
       successList.add(user); 
      } 
     } 

     addToFailureList(String user) { 
      synchronized(failureList) { 
       failureList.add(user); 
      } 
     } 

     class GetData extends Thread { 

      String userID; 

      public GetData(String user) { 
      this.userID = user; 
      } 

      public void run() { 
      try { 
       dataManager.getData(user); 
       addToSuccessList(user); 
      } catch(Execption e) { 
       addToFailureList(user); 
      } 

     } 
+0

Es ist nichts falsch daran. Jeder Thread kann einen neuen Thread starten. –

+2

http://stackoverflow.com/questions/7224670/threads-within-threads-in-java hast du dir das angesehen? –

+0

@ BalázsMáriaNémeth Danke dafür, das habe ich irgendwie vermisst! –

Antwort

8

Ein besserer Ansatz ein ThreadPool und ein ScheduledExecutorService zu verwenden wäre. Das Starten eines Threads aus einem Thread ist nicht von Natur aus schlecht (schließlich läuft alles innerhalb eines Threads, also musst du das irgendwo tun!), Kann aber auf einen Fehler in deinem Design hinweisen.

+0

Danke Tim, ich werde ThreadPool eine Lektüre geben! –

+0

ThreadPoolExecutor löst ein anderes Problem als Thread. Ein ThreadPoolExecutor ist ein ExecutorService, der eine Anzahl von Threads besitzt und sie zum Ausführen von Aufgaben verwendet. Der Unterschied besteht darin, dass die Methode run() einer Aufgabe normalerweise eine Sache ausführt und dann zurückkehrt. Die Methode run(), die wir einem nackten Thread geben, hat normalerweise eine Schleife, die unbegrenzt läuft (z. B. Warten auf eingehende Verbindungen an einem Port oder Ähnliches). –

2

In Java sind alle Threads Eigentum des Prozesses, und es spielt keine Rolle, von wo sie gestartet werden. Es ist also nichts falsch mit Ihrem Code.

Verwandte Themen