2016-11-18 3 views
1

Ich habe vor kurzem mit Themen experimentiert. Meine Experimente haben eine Frage aufgeworfen, die ich gerne beantworten würde, um mein Verständnis zu bestätigen.Concurrency - geht zurück auf Hauptthread

Wenn ich diesen Satz von Klassen:

public class HelloThread implements Runnable { 

    public void run(){ 
     doSomething(); 
     doSomethingMore(); 
     andSomethingMore(); 
    } 

    public void doSomething(){ 
     // print something 
    } 

    public void doSomethingMore(){ 
     // print more 
    } 

    public void andSomethingMore(){ 
     HelloThreadExtension helloThreadExtension = new helloThreadExtension(); 
     helloThreadExtension.doSomethingWithExtension(); 
    } 

} 

public class HelloThreadExtension { 

    public void doSomethingWithExtension(){ 
     // do something more advanced than printing 
    } 
} 

Und dann, wenn ich die HelloThread Faden, doSomething() und doSomethingMore() läuft in neu getrennten Thread starten, aber andSomethingMore() wird im Hauptthread, zurück laufen seit HelloThreadExtension nicht implement Runnable oder extends Thread?

ODER

Ist es eigentlich, dass es in dem separaten Thread ausgeführt wird, die einmal gestartet wurde HelloThread.start() genannt wurde?

Grüße, Bob

+0

Ihre ganze run-Methode in neu erstellten Thread ausgeführt wird, und Faden, der es weiter mit seiner eigenen Logik gehen aufrufen. Sie können Join verwenden, um den Thread anzuhalten, bis ein anderer Thread die Ausführung stoppt, aber jede Methode innerhalb des Threads wird nicht im Thread ausgeführt, der sie aufgerufen hat. Ich hoffe, das hilft –

+1

'andSomethingMore' wird im selben Thread laufen. Fügen Sie 'System.err.printLn (Thread.currentThread(). GetName());' hinzu, um den Namen des aktuellen Threads als Beweis zu drucken. –

+0

Und für die Aufzeichnung: Sie ** unbedingt ** möchten @Override auf jede Methode, die Sie schreiben, dass Sie denken, sollte etwas außer Kraft setzen. – GhostCat

Antwort

1

der innerhalb der run-Methode genannt gesamten Code wird in einem neuen Thread ausgeführt, und nach der Ausführung Finishing er die Kontrolle an Haupt-Thread zurückkehren wird mit der Codeausführung fortzusetzen.

Sie können es sehen, indem Sie den Code debbugging und einen Haltepunkt vor dem Thread.start Anruf und andere innerhalb der run-Methode der Runnable Instanz hinzufügen. Ich denke, diese Debugging-Übung wird Ihnen helfen zu verstehen, wie Threads innerhalb der JVM funktioniert.

hofft, dass dies hilft

+0

Entweder missverstehe ich dich oder das ist nicht ganz richtig. Der Code innerhalb der run-Methode wird parallel zum Hauptthread ausgeführt. Die Art und Weise, wie dies formuliert wird, klingt so, als würde man sagen, dass die run-Methode blockiert, bis ihre Arbeit beendet ist, und dann die Kontrolle zurückgibt – tddmonkey

+0

"und nach Beendigung der Ausführung wird die Kontrolle an den Haupt-Thread zurückgegeben, um mit der Code-Ausführung fortzufahren". Dieser Teil ist nicht wahr, es sei denn, der Hauptthread blockiert explizit (via thread.join()), um auf das Ende des Threads zu warten. Ansonsten läuft der Haupt-Thread einfach weiter, ohne Rücksicht auf den anderen Thread. Der Rest der Antwort ist korrekt. – qexyn

Verwandte Themen