2017-06-06 1 views
1

Nach dem Lesen über Join-Methode habe ich einige Zweifel: Ich denke, Multithreading ist ein Weg, um Parallelität in unserem Programm einzuführen und glauben, einige Zeit brauchen wir einige Thread fertig vor einem anderen. Aber ich verstehe nicht, warum ein Programmierer etwas schreiben wie folgt aus:Warum wir einen neuen Thread erstellen und join() verwenden, um den übergeordneten Thread warten zu lassen?

public static void main(String[] args) { 
    Thread t1 = new Thread(new MyRunnable(), "t1"); 
    Thread t2 = new Thread(new MyRunnable(), "t2"); 

    t1.start(); 

    t1.join(); 

    t2.start(); 

    t2.join(); 
} 

was ist der Vorteil vs Code unten in diesem Beispiel mit Gewinde:

public static void main(String[] args) { 
    Thread t1 = new Thread(new MyRunnable(), "t1"); 
    Thread t2 = new Thread(new MyRunnable(), "t2"); 

    t1.run();//just run the task of thread without start new thread 
    t2.run(); 
} 

in ersten Beispiel Haupt-Thread bis t1 pausieren sollte fertig und starte dann t2 und warte bis zum Ende und im zweiten Beispiel passiert es auch.

Warum wir einen neuen Thread erstellen und join() verwenden, um den übergeordneten Thread warten zu lassen? Warum kann nicht der übergeordnete Thread anstelle des neuen Threads verwendet werden?

+0

Berufung *** tx. run() *** startet keinen Thread, das ist der Unterschied! –

+0

Im zweiten Fall ist Ihre Hauptmethode möglicherweise vor Ihrem Thread t1 und t2 beendet. Das ist der Unterschied. Im ersten Fall wird die Main-Methode niemals vor den Threads t1 und t2 beendet. –

+0

Ich weiß es, meine Frage ist, warum Thread erstellen, wenn wir den aktuellen Thread stoppen müssen, bis es fertig ist? Warum hat man einfach nicht den aktuellen Thread anstelle des neuen Threads benutzt? – MTB

Antwort

1

In beiden Fällen erhalten Sie keine Vorteile. Im ersten Beispiel haben Sie zwei Threads und join() ist nicht sinnvoll.

Aber ein Szenario davon ausgehen, wo

  1. Sie mehrere Threads haben (Hauptgewinde, T1, T2, T3 und T4)
  2. Main, T1, T2 können parallel aber T3 laufen für die Fertigstellung der T4

Im obigen Fall warten soll, können alle Threads beginnen parallel aber Sie treten nur T3 und T4 Threads.

Siehe unten Beitrag für Anwendungsfälle von join():

Why we should use Join in threads?

Wenn Sie die erweiterte Version von Multi-Threading erkunden möchten, verwenden Sie CountDownLatch anstelle von join()

1

Der erste Weg profitiert nicht von Multi Threading.

Wir haben es mit einem einzigen Thread schreiben konnte, ändert es nichts in Bezug auf Multi-Threading:

Thread t1 = new Thread(new MyRunnable(), "t1"); 
t1.start(); 
t1.join(); 

t1 = new Thread(new MyRunnable(), "t2"); 
t1.start(); 
t1.join(); 

Der zweite Weg, die t1.run(); statt t1.start(); verwendet startet nicht den Faden und so diese:

t1.run(); 
t2.run(); 

sind einfache synchrone (Blockierung) auf die Thread Objekte aufruft.
Erst nachdem t1.run() zurückgegeben wurde, wird t 2.run() aufgerufen.

+0

Ich habe meine Antwort: Der erste Weg profitiert nicht von Multi Threading. Ich wusste, Unterschied von run und starten, im zweiten Code wollte ich Call-Run-Methode wie jeder andere Methodenaufruf Code innerhalb von t1 und t2 ausführen() ausführen. – MTB

Verwandte Themen