1. Geben Sie Daten über Klassenvariablen und -methoden zurück
Die Verwendung dieser Methode zur Rückgabe von Daten erfordert den Aufruf der Startmethode, bevor die Daten über Klassenvariablen oder -methoden abgerufen werden können. Sehen wir uns zunächst an, welche Ergebnisse wir aus Beispiel 2-13 erhalten.
Kopieren Sie den Codecode wie folgt:
Paket mythread;
Die öffentliche Klasse MyThread erweitert Thread
{
privater String-Wert1;
privater String-Wert2;
public void run()
{
value1 = „Daten über Mitgliedsvariablen zurückgeben“;
value2 = „Daten über Member-Methode zurückgeben“;
}
public static void main(String[] args) löst eine Ausnahme aus
{
MyThread thread = new MyThread();
thread.start();
System.out.println("value1:" + thread.value1);
System.out.println("value2:" + thread.value2);
}
}
Das Ausführen des obigen Codes kann zu den folgenden Ergebnissen führen:
Kopieren Sie den Codecode wie folgt:
Wert1:null
Wert2:null
Die obigen Laufergebnisse sehen sehr ungewöhnlich aus. In der Ausführungsmethode wurden Wert1 und Wert2 Werte zugewiesen, es wird jedoch Null zurückgegeben. Der Grund dafür ist, dass die Werte von Wert1 und Wert2 unmittelbar nach dem Aufruf der Startmethode ausgegeben werden und die Ausführungsmethode hier die Anweisungen, die Wert1 und Wert2 Werte zuweisen, noch nicht ausgeführt hat. Um diese Situation zu vermeiden, müssen Sie warten, bis die Ausführungsmethode ausgeführt wird, bevor Sie den Code ausführen, der Wert1 und Wert2 ausgibt. Daher können wir uns vorstellen, die Schlafmethode zu verwenden, um den Hauptthread zu verzögern. Beispielsweise können wir nach thread.start() die folgende Anweisung hinzufügen:
Schlaf (1000);
Dies kann dazu führen, dass der Hauptthread die Ausführung um 1 Sekunde verzögert, bevor er fortfährt. Dabei gibt es jedoch ein Problem: Woher wissen wir, wie lange die Verzögerung dauern soll? In diesem Beispiel gibt es nur zwei Zuweisungsanweisungen in der Ausführungsmethode und es wird nur ein Thread erstellt. Daher ist eine Verzögerung von 1 Sekunde ausreichend. Wenn die Anweisungen in der Ausführungsmethode jedoch komplex sind, ist diese Zeit schwer vorherzusagen. Daher ist diese Methode nicht stabil.
Unser Ziel ist es, die Werte von Wert1 und Wert2 zu erhalten, wir müssen also nur bestimmen, ob Wert1 und Wert2 null sind. Wenn keiner von ihnen null ist, können diese beiden Werte ausgegeben werden. Um diesen Zweck zu erreichen, können wir den folgenden Code verwenden:
Kopieren Sie den Codecode wie folgt:
while (thread.value1 == null || thread.value2 == null);
Die Verwendung der obigen Anweisung kann diese Situation sehr stabil vermeiden, diese Methode verbraucht jedoch zu viele Systemressourcen. Sie können sich vorstellen, dass die Zuweisung von Wert1 und Wert2 lange dauert, wenn der Code in der Ausführungsmethode sehr komplex ist. Daher muss die While-Schleife so lange ausgeführt werden, bis Wert1 und Wert2 nicht leer sind. Daher können wir die obige Aussage wie folgt verbessern:
Kopieren Sie den Codecode wie folgt:
while (thread.value1 == null || thread.value2 == null)
Schlaf(100);
In der while-Schleife wird nach der ersten Beurteilung der Werte von Wert1 und Wert2 100 Millisekunden lang in den Ruhezustand versetzt und dann diese beiden Werte beurteilt. Dadurch werden weniger Systemressourcen beansprucht.
Obwohl die obige Methode sehr gut gelöst werden kann, bietet uns das Threading-Modell von Java eine bessere Lösung, nämlich die Join-Methode. Wie bereits erläutert, besteht die Funktion von Join darin, mithilfe von Threads von der asynchronen Ausführung zur synchronen Ausführung zu wechseln. Wenn der Thread synchron ausgeführt wird, unterscheidet es sich nicht vom Abrufen der Rückgabedaten von einer gewöhnlichen Methode. Daher kann dieses Problem mit Code wie dem folgenden effizienter gelöst werden:
Kopieren Sie den Codecode wie folgt:
thread.start();
thread.join();
Nachdem thread.join () ausgeführt wurde, wurde die Ausführungsmethode des Thread-Threads beendet, was bedeutet, dass der Thread-Thread beendet wurde. Daher können Sie nach thread.join() sicher jede Ressource der MyThread-Klasse verwenden, um die zurückgegebenen Daten abzurufen.
2. Daten über die Rückruffunktion zurückgeben
Tatsächlich wurde diese Methode in „Drei Methoden zum Übergeben von Daten an Threads“ eingeführt. Im Beispiel des Artikels „Drei Methoden zum Übergeben von Daten an Threads“ werden die Berechnungsergebnisse über die Prozessmethode der Work-Klasse an den Thread übergeben, gleichzeitig werden jedoch auch drei Zufallszahlen vom Thread über die erhalten Prozessmethode. Daher kann diese Methode sowohl Daten an den Thread übergeben als auch Daten von diesem abrufen.