2016-08-08 9 views
0
Ausführung

hier beendet haben ist mein Codenicht in der Lage, vorherzusagen, wenn alle Fäden

package pe.entel.ftp; 

public class Myclass implements Runnable { 
    public void run() { 
     System.out.println(Thread.currentThread().getName()); 
    } 
    public static void main(String[] args) { 
     Myclass runnable = new Myclass(); 
     ThreadGroup tg1 = new ThreadGroup("Parent ThreadGroup"); 

     for (int i = 0; i < 100; i++) { 
      Thread t1 = new Thread(tg1, runnable, i + ""); 
      t1.start(); 
      System.out.println("Thread Group Name: " + tg1.getName()); 

     } 
     while (tg1.isDestroyed()) { 
      System.out.println("yes success"); 
     } 

     System.out.println("completed"); 

    } 
} 

während mein Teil p o/

Thread Group Name: Parent ThreadGroup 
    Thread Group Name: Parent ThreadGroup 
    Thread Group Name: Parent ThreadGroup 
    Thread Group Name: Parent ThreadGroup 
    Thread Group Name: Parent ThreadGroup 
completed 
84 
86 
88 
90 
92 
94 
96 
98 
95 
97 
99 

Hier bin ich vorhersagen, nicht in der Lage, wann genau Gruppe Thread Die Ausführung der while-Schleife zur Überprüfung, ob die Thread-Gruppe zerstört wurde, funktioniert ebenfalls nicht. Auch nach dem Drucken werden einige Threads ausgeführt.

Antwort

1

Eine ThreadGroup führt die Ausführung nicht aus. Wenn Sie für alle Threads warten wollen zu beenden, müssen Sie sie sammeln und für sie alle warten:

List<Thread> allThreads = new ArrayList<>(); 

for (int i = 0; i < 100; i++) { 
    Thread t1 = new Thread(tg1, runnable, i + ""); 
     t1.start(); 
    allThreads.add(t1); 
} 

allThreads.forEach(Thread::join); 

ThreadGroups existieren länger als die Fäden sie enthalten, können Sie neue Themen zu einem Thread hinzuzufügen, nachdem Alle bisherigen Threads sind beendet. Sie gruppieren nur Threads, kontrollieren sie nicht.

+0

Ich möchte alle Threads auf einmal ausführen.Für den Code, den Sie angegeben haben. Threads werden nacheinander wegen Join ausgeführt. – smith

+0

Nein. Die Threads werden in der for-Schleife mit dem Befehl 't1.start()' gestartet und parallel ausgeführt. Was sequentiell gemacht wird, ist der Join, also das Warten auf das Ende des Threads. Sie warten, bis der erste Thread mit 'join()' abgeschlossen ist. In diesem Fall warten Sie auf den Abschluss des zweiten Threads. Wenn das schneller als der erste Thread ist, kehrt 'join()' sofort zurück, und Sie springen auf den dritten und so weiter. –

+0

k danke ........... – smith

0

Ich kann nicht vorhersagen, wann genau Fadengruppe Ausführung

Eine andere Möglichkeit ist die Vollendung, es zu tun ist, einen ExecutorService Thread-Pool zu verwenden, anstatt den Fäden selbst von Forking:

ExecutorService threadPool = Executors.newCachedThreadPool(); 
for (int i = 0; i < 100; i++) { 
    threadPool.submit(new Myclass()); 
} 
// shutdown the pool after the last runnable has been submitted 
threadPool.shutdown(); 
// wait for all of the jobs to finish 
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); 

Sie können auch eine Executors.newFixedThreadPool(#) verwenden, um nur eine bestimmte Anzahl von Threads zu forcieren, um die Anzahl gleichzeitiger Operationen zu begrenzen.