Was ist in einer einfach zu verstehenden Erklärung Runnable in Java? [geschlossen]

92

Was ist in Java für Laien "lauffähig"? Ich bin ein AP-Programmierschüler in der High School, dessen Aufgabe es ist, Nachforschungen anzustellen oder bei anderen herauszufinden, was "lauffähig" ist (wir kommen gerade in die OOP und haben noch keine Themen berührt).

user1809295
quelle
Es gibt nur eine nützliche Zeile in den API-Dokumenten: "Der allgemeine Vertrag des Methodenlaufs lautet, dass er jegliche Maßnahmen ergreifen kann."
Tom Hawtin - Tackline
Eine viel interessantere Forschungsaufgabe wäre gewesen: Was in Java für Laien "stoppbar" ist. Die heutigen Ausbilder sind so ...
Udo Klimaschewski
8
@UdoKlimaschewski - der Mann ist ein High - School - Schüler, nicht ein Student oder Doktorand. Die Erwartungen dieses Lehrers entsprechen dem Niveau des Schülers ... IMO. Ich stimme jedoch zu, dass "first ask on SO" KEINE geeignete Forschungstechnik für jemanden auf OP-Ebene ist.
Stephen C.

Antworten:

185

Ein Runnable ist im Grunde eine Art Klasse (Runnable ist eine Schnittstelle), die in einen Thread eingefügt werden kann und beschreibt, was der Thread tun soll.

Die ausführbare Schnittstelle erfordert, dass die Klasse die Methode run()wie folgt implementiert :

public class MyRunnableTask implements Runnable {
     public void run() {
         // do stuff here
     }
}

Und dann benutze es so:

Thread t = new Thread(new MyRunnableTask());
t.start();

Wenn Sie die RunnableSchnittstelle nicht hätten , hätte die Thread-Klasse, die für die Ausführung Ihrer Inhalte im anderen Thread verantwortlich ist, nicht das Versprechen, eine run()Methode in Ihrer Klasse zu finden, sodass Sie Fehler erhalten könnten. Deshalb müssen Sie die Schnittstelle implementieren.

Erweitert: Anonymer Typ

Beachten Sie, dass Sie eine Klasse nicht wie gewohnt definieren müssen. Sie können dies alles inline tun:

Thread t = new Thread(new Runnable() {
    public void run() {
        // stuff here
    }
});
t.start();

Dies ist ähnlich wie oben, nur dass Sie keine andere benannte Klasse erstellen.

opatut
quelle
66
Dies ist eine großartige Antwort, die die Behauptung, dass die Frage "in ihrer gegenwärtigen Form nicht vernünftig beantwortet werden kann", völlig widerlegt.
Russell Silva
1
Ich weiß, es war lange her, aber ich habe eine Frage. Thread wird nur einmal ausgeführt oder läuft im Programm immer wieder ab, wenn ich einen Thread starte?
Gamo
5
Der Thread wird ausgeführt, bis die runMethode beendet ist. Anschließend wird der Thread geschlossen. Wenn ein Thread immer wieder ausgeführt werden soll, platzieren Sie eine Schleife innerhalb der runMethode.
Opatut
2
Oder einfach mit einer Java 8 Lambda-Funktion:new Thread(() -> System.out.println("hello from other thread")).start();
Gabe
9

Runnable ist eine Schnittstelle wie folgt definiert:

interface Runnable {
    public void run();
}

Um eine Klasse zu erstellen, die sie verwendet, definieren Sie die Klasse einfach als (public) class MyRunnable implements Runnable {

Es kann verwendet werden, ohne einen neuen Thread zu erstellen. Es ist im Grunde Ihre grundlegende Schnittstelle mit einer einzigen Methode, run, die aufgerufen werden kann.

Wenn Sie einen neuen Thread mit dem Parameter runnable erstellen, wird die run-Methode in einem neuen Thread aufgerufen.

Es sollte auch beachtet werden, dass Threads implementiert Runnablewerden und dies aufgerufen wird, wenn der neue Thread erstellt wird (im neuen Thread). Die Standardimplementierung ruft nur das Runnable auf, das Sie im Konstruktor übergeben haben. Aus diesem Grund können Sie new Thread(someRunnable)die runMethode von Thread einfach nicht überschreiben .

Alex Coleman
quelle
Wollen Sie damit sagen, dass es im Grunde keinen Unterschied zwischen dem Erben von Thread oder der Implementierung von Runnable gibt? Wird Thread bei Verwendung des Runnable als Wrapper sowie als Executor verwendet?
Opatut
Ich sage, es gibt keinen Unterschied zwischen [Thread erweitern und Lauf überschreiben] und [Erstellen einer neuen Instanz von Thread mit einer ausführbaren Datei, die dieselbe Ausführungsmethode hat]
Alex Coleman
Ja, das habe ich verstanden. Aber gibt es wirklich keinen Unterschied, weder Leistung noch sonst?
Opatut
3
@ AlexColeman - es gibt einen großen Unterschied. Wenn Sie das ThreadThread-Pooling erweitern, ist es schwierig, und wenn Sie das Thread-Pooling nicht implementieren, tragen Sie die erheblichen Kosten für das Erstellen neuer Threads. Im Gegensatz dazu Runnablebedeutet die einfache Implementierung , dass Sie problemlos Dinge wie ThreadPoolExecutorServiceeinen Thread-Pool eines Drittanbieters verwenden können.
Stephen C