Kann mir jemand vorschlagen, wie ich einen Parameter an einen Thread übergeben kann?
Wie funktioniert es auch für anonyme Klassen?
java
multithreading
Steve
quelle
quelle
Consumer<T>
.Antworten:
Sie müssen den Parameter im Konstruktor an das Runnable-Objekt übergeben:
und rufe es so auf:
quelle
r
dasselbe Argument hat. Wenn wir also unterschiedliche Argumente an mehrere ausgeführte Threads übergeben möchten,MyThread
müssen wir eine neueMyThread
Instanz mit dem gewünschten Argument für jeden Thread erstellen . Mit anderen Worten, um einen Thread zum Laufen zu bringen, müssen zwei Objekte erstellt werden: Thread und MyThread. Wird dies in Bezug auf die Leistung als schlecht angesehen?Für anonyme Klassen:
Als Antwort auf Fragenbearbeitungen erfahren Sie hier, wie es für anonyme Klassen funktioniert
Benannte Klassen:
Sie haben eine Klasse, die Thread erweitert (oder Runnable implementiert), und einen Konstruktor mit den Parametern, die Sie übergeben möchten. Wenn Sie dann den neuen Thread erstellen, müssen Sie die Argumente übergeben und dann den Thread starten, ungefähr so:
Runnable ist eine viel bessere Lösung als Thread BTW. Also würde ich bevorzugen:
Diese Antwort entspricht im Wesentlichen der ähnlichen Frage: Übergeben von Parametern an ein Thread-Objekt
quelle
parameter
direkt von derrun()
Methode aus zugreife , ohne ein Feld wie diesesp
zu verwenden. Es scheint zu funktionieren. Gibt es ein subtiles Multithreading , was ich vermisse von nicht kopieren vorher?parameter
p
)
im ersten Beispielfinal X parameter
vor dernew Runnable()
Leitung hatte, konnte ichparameter
hineingehenrun()
. Ich musste das Extra nicht tunp = parameter
.final
ist nicht mehr so wichtig; Es ist genug, wenn die Variable effektiv endgültig ist (obwohl es keinen Schaden anrichtet)über den Konstruktor einer Runnable- oder Thread-Klasse
quelle
@Override
für?@Override
explizit an, dass die abstrakte Methode in der Thread-Klasse überschrieben wird.Diese Antwort kommt sehr spät, aber vielleicht findet es jemand nützlich. Es geht darum, wie Sie einen oder mehrere Parameter an eine übergeben,
Runnable
ohne eine benannte Klasse zu deklarieren (praktisch für Inliner):Natürlich können Sie die Ausführung
start
auf einen günstigeren oder angemesseneren Zeitpunkt verschieben. Und es liegt an Ihnen, was die Signatur derinit
Methode sein wird (es kann also mehr und / oder andere Argumente erfordern) und natürlich sogar ihren Namen, aber im Grunde haben Sie eine Idee.Tatsächlich gibt es auch eine andere Möglichkeit, einen Parameter unter Verwendung der Initialisierungsblöcke an eine anonyme Klasse zu übergeben. Bedenken Sie:
Alles geschieht also innerhalb des Initialisierungsblocks.
quelle
this.myParam
dann wirklich notwendig? Könnten Sie nicht einfach die privaten Variablen löschen und auf die Variable aus dem äußeren Bereich verweisen? Ich verstehe (natürlich), dass dies einige Auswirkungen hat, z. B. dass die Variable nach dem Starten des Threads offen ist, um sich zu ändern.Wenn Sie einen Thread erstellen, benötigen Sie eine Instanz von
Runnable
. Der einfachste Weg, einen Parameter zu übergeben, besteht darin, ihn als Argument an den Konstruktor zu übergeben:Wenn Sie den Parameter dann ändern möchten, während der Thread ausgeführt wird, können Sie Ihrer ausführbaren Klasse einfach eine Setter-Methode hinzufügen:
Sobald Sie dies haben, können Sie den Wert des Parameters ändern, indem Sie wie folgt aufrufen:
Wenn Sie beim Ändern des Parameters eine Aktion auslösen möchten, müssen Sie natürlich Sperren verwenden, was die Dinge erheblich komplexer macht.
quelle
Um einen Thread zu erstellen, erstellen Sie normalerweise Ihre eigene Implementierung von Runnable. Übergeben Sie die Parameter an den Thread im Konstruktor dieser Klasse.
quelle
Sie können entweder die oder die und erweitern und Parameter angeben, wie Sie möchten. Es gibt einfache Beispiele in den Dokumenten . Ich werde sie hier portieren:
Thread
class
Runnable
class
quelle
Schreiben Sie entweder eine Klasse, die Runnable implementiert, und übergeben Sie alles, was Sie benötigen, in einem entsprechend definierten Konstruktor, oder schreiben Sie eine Klasse, die Thread um einen entsprechend definierten Konstruktor erweitert, der super () mit entsprechenden Parametern aufruft.
quelle
Ab Java 8 können Sie ein Lambda verwenden, um Parameter zu erfassen, die effektiv endgültig sind . Zum Beispiel:
quelle
In Java 8 können Sie
lambda
Ausdrücke mit der Concurrency-API und demExecutorService
als übergeordneten Ersatz für die direkte Arbeit mit Threads verwenden:Siehe auch
executors
Javadocs .quelle
Ich weiß, dass ich ein paar Jahre zu spät bin, aber ich bin auf dieses Problem gestoßen und habe einen unorthodoxen Ansatz gewählt. Ich wollte es tun, ohne eine neue Klasse zu bilden, also habe ich mir Folgendes ausgedacht:
quelle
Parameterübergabe über die Methoden start () und run ():
quelle
Sie können eine Klasse von Runnable ableiten und während der Konstruktion (z. B.) den Parameter übergeben.
Starten Sie es dann mit Thread.start (Runnable r).
Wenn Sie meinen, während der Thread ausgeführt wird, halten Sie einfach einen Verweis auf Ihr abgeleitetes Objekt im aufrufenden Thread und rufen Sie die entsprechenden Setter-Methoden auf (ggf. synchronisieren).
quelle
Es gibt eine einfache Möglichkeit, Parameter an ausführbare Dateien zu übergeben. Code:
quelle
Nein, Sie können keine Parameter an die
run()
Methode übergeben. Die Signatur sagt Ihnen das (es hat keine Parameter). Der wahrscheinlich einfachste Weg, dies zu tun, wäre die Verwendung eines speziell erstellten Objekts, das einen Parameter im Konstruktor übernimmt und in einer endgültigen Variablen speichert:Sobald Sie dies getan haben, müssen Sie auf die Datenintegrität des Objekts achten, das Sie an die 'WorkingTask' übergeben. Die Daten sind jetzt in zwei verschiedenen Threads vorhanden, sodass Sie sicherstellen müssen, dass sie threadsicher sind.
quelle
Eine weitere Option; Mit diesem Ansatz können Sie das Element Runnable wie einen asynchronen Funktionsaufruf verwenden. Wenn Ihre Aufgabe kein Ergebnis zurückgeben muss, z. B. nur eine Aktion ausführt, müssen Sie sich keine Gedanken darüber machen, wie Sie ein "Ergebnis" zurückgeben.
Mit diesem Muster können Sie ein Element wiederverwenden, für das Sie einen internen Status benötigen. Wenn Parameter im Konstruktor nicht übergeben werden, ist Sorgfalt erforderlich, um den Programmzugriff auf Parameter zu vermitteln. Möglicherweise benötigen Sie weitere Überprüfungen, wenn Ihr Anwendungsfall verschiedene Anrufer usw. umfasst.
}}
Thread t = neuer Thread (neuer MyRunnable (Parameter)); t.start ();
Wenn Sie ein Ergebnis der Verarbeitung benötigen, müssen Sie auch den Abschluss von MyRunnable koordinieren, wenn die Unteraufgabe abgeschlossen ist. Sie können einen Rückruf weiterleiten oder einfach auf den Thread 't' usw. warten.
quelle
Speziell für Android
Für Rückrufzwecke implementiere ich normalerweise mein eigenes Generikum
Runnable
mit Eingabeparametern:Die Verwendung ist einfach:
Im Manager:
quelle
Erstellen Sie eine lokale Variable in Ihrer Klasse, die
extends Thread
oderimplements Runnable
.Auf diese Weise können Sie eine Variable übergeben, wenn Sie sie ausführen.
Die Ausgabe:
quelle