Wie auf ein Runnable-Objekt von Thread?
Mögliche Duplikate: need-help-Rückgabe-Objekt-im-thread-run-Methode
Hallo. Ich habe eine Klasse die runnable und ich habe eine Liste, speichern Threads instanziiert, mit unterschiedlichen Objekten der Klasse. Wie kann ich auf Eigenschaften der zugrunde liegenden Objekte das thread-Objekt ausgeführt? Hier ist ein Beispiel:
public class SO {
public static class TestRunnable implements Runnable {
public String foo = "hello";
public void run() {
foo = "world";
}
}
public static void main(String[] args) {
Thread t = new Thread(new TestRunnable());
t.start();
//How can I get the value of `foo` here?
}
}
Abgesehen von nicht wirklich sicher, was Sie im Sinn haben, denke ich, müssen Sie spiegelung für diese, und auch sicher sein, es ist kein Sicherheits-manager in Ihrem Weg. Aber vielleicht könnten Sie genauer beschreiben, was es ist Sie versuchen, zu erreichen.
Ich glaube, Sie können eine Unterklasse
Das ist nicht gut, wenn das Runnable-Klasse muss Unterklasse etwas anderes, da Java erlaubt nur einfachvererbung. Das Hauptziel von java.lang.Lauffähig ist, soweit ich sagen kann, ist, zu umgehen dieses Problem, indem Sie mit Thread(java.lang.Runnable) hinzufügen thread Funktionalität einer Klasse, die bereits Unterklassen etwas anderes.
Ehrlich gesagt, ich kann nicht herausfinden, möglicher Grund, warum Sie wollen, dies zu tun. Vielleicht sollten Sie sich Fragen, eine andere Frage?
Ich glaube, Sie können eine Unterklasse
Thread
selbst und überschreiben Thread.run()
statt übergeben Runnable
. Dann foo
wäre nur ein Attribut der Thread
.Das ist nicht gut, wenn das Runnable-Klasse muss Unterklasse etwas anderes, da Java erlaubt nur einfachvererbung. Das Hauptziel von java.lang.Lauffähig ist, soweit ich sagen kann, ist, zu umgehen dieses Problem, indem Sie mit Thread(java.lang.Runnable) hinzufügen thread Funktionalität einer Klasse, die bereits Unterklassen etwas anderes.
Ehrlich gesagt, ich kann nicht herausfinden, möglicher Grund, warum Sie wollen, dies zu tun. Vielleicht sollten Sie sich Fragen, eine andere Frage?
InformationsquelleAutor Fluffy | 2010-02-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehe ich keinen Weg, es zu tun in der
java.lang.Thread
docs.Meine beste Antwort ist, sollten Sie wahrscheinlich verwenden
List<Runnable>
anstelle von (oder zusätzlich zu)List<Thread>
. Oder vielleicht möchten Sie eine Art von anzeigen Struktur, so dass Sie Zugriff auf die Runnable aus dem Thread. (Zum Beispieljava.util.HashMap<java.lang.Thread, java.lang.Runnable>
)<>
's, das einwickeln derList<Runnable>
mit `sOh wow, ich wusste das auch. Warum ich nicht glaube, dass dieses format mein code, weiß ich nicht. Alles was ich sagen kann ist, es war ein wirklich langer Tag. Danke für den Tipp.
Ich bin neugierig auf die downvote. Wer auch immer das war, darauf zu erklären?
InformationsquelleAutor Platinum Azure
Die concurrency-Bibliothek unterstützt diese auch. Hinweis: Wenn Sie Ihre Aufgabe löst eine Exception aus, wird die Zukunft halten Sie diese und werfen die Verpackung-Ausnahme beim aufrufen von get()
InformationsquelleAutor Peter Lawrey
BTW, im echten Fall müssen Sie
Callable
undFutureTask
Ja, Sie müssen eine Referenz zum Objekt, das Sie ausgeführt und das Ergebnis an Sie, eine
Runnable
in diesem Fall.Callable
undFutureTask
ist die passende Art und Weise, Dinge zu tun, die Sie wollen.Ich denke, dass ich einfach nicht sehen.
InformationsquelleAutor Igor Artamonov
Wenn Sie wollen, um den Rückgabewert der asynchronen Berechnung, betrachten Aufrufbar und FutureTask:
InformationsquelleAutor Thilo
Wenn dein thread hat Status-Informationen, vergessen Ausführbar und einfach erweitern Thread und überschreiben der run-Methode.
InformationsquelleAutor gerardw
Ich denke, im Allgemeinen, Sie können/sollten es vermeiden, dies zu tun, aber wenn Sie wirklich tun müssen, sollte es nicht so etwas wie MatrixFrog s Vorschlag funktionieren (ungetestet):
?
Ich habe gerade abgegeben, Bearbeiten, sollte dies korrigieren (das vertauschen der beiden Aussagen der Konstruktor so, dass der super-Aufruf die erste Anweisung des Konstruktors)
InformationsquelleAutor Chinasaur
Diese ist, wie könnte man implementieren diese direkt.
Jedoch, die moderne (und weniger fehleranfällige) Möglichkeit, das zu tun diese Art der Sache ist die Verwendung des higher-level-concurrency-Klassen in
java.util.concurrent
.InformationsquelleAutor Stephen C
Ich hatte das gleiche problem. Hier ist meine Lösung:
InformationsquelleAutor user1870213
Geben ein konkretes Beispiel für Paul Crowley ' s Lösung, ich denke, das ist, was er sagt:
InformationsquelleAutor Janus Varmarken
Könnten Sie Unterklasse Thread, und fügen Sie die Methode, die Sie brauchen. Sie haben, um Ihre eigene Kopie der Ziel-Thread und überschreiben alle Thread-Konstruktoren verwenden Sie zum erstellen der Threads, weil einige lästige details der Implementierung der Thread.
InformationsquelleAutor Paul Crowley
Ich denke, wenn Sie können, es ist wieder die situation. Dann ist in diesem Fall eine gute Lösung ist die Speicherung der thread der runnable-Klasse. Und dein Thread hat eine start () - Funktion, starten und selbst die hiesigen thread und Aufruf-thread.start. So können Sie eine Liste der Objekte mit Gewinde. Sie können auch ein get-accessor der thread.
InformationsquelleAutor