Was ist "Runnable"?

Status
Nicht offen für weitere Antworten.

Souljumper

Aktives Mitglied
hallo,

ich habe hier ein Klasse in der etwas benutzt wird, dass sich Runnable nennt. Der Code stammt aus einer Aufgabe die ich lösen soll, hab versucht das Runnable zu googeln, aber ich finde immer nur Suchtreffer zum Thema Threading/Multi-Threading.



Code:
    private static class Item {
        String name;
        char key;
        Runnable action;

        public Item(String name, char key, Runnable action) {
            this.name = name;
            this.key = key;
            this.action = action;
        
}

Was ist/macht dieses Runnable?
 

Souljumper

Aktives Mitglied
ja, da hab ich so auch gefunden beim googeln. auf meinem aufgabenzettel steht aber noch folgende Bemerkung:

Bei dieser Aufgabe geht es bei Runnable nicht um Multithreading (auch wenn Sie
das vielleicht so im Internet finden).

es muss also noch ein anderers runnable geben, jemand eine idee was gemeint sein könnte. diese ganze threading suchtreffer hatte ich auch, das ist scheinbar nicht das was gefragt ist.
 
M

maki

Gast
java.lang.Runnable ist immer Multithreading, mir ist kein anderes Runnable bekannt, vielleicht hat dein Lehrer ein eigenes Lehrer geschrieben.
 

lhein

Top Contributor
Es gibt nur ein Runnable. Dieses Runnable führt Arbeiten aus, die im Normalfall den Hauptthread des Programmes nicht blockieren sollen. Man kann es aber auch so anstellen, dass es den Hauptthread blockiert.
Worauf Dein Lehrer hinaus will erschliesst sich mir aus diesen spärlichen Informationen noch nicht so recht.

Bei dieser Aufgabe geht es bei Runnable nicht um Multithreading (auch wenn Sie
das vielleicht so im Internet finden).

Vielleicht eine Taktik des Lehrers, um die fleissigen Googler zum selbst nachdenken zu bewegen, anstatt Code aus dem Internet abzupinseln ?

lhe
 
B

Beni

Gast
Runnable ist vorallem mal ein Interface das die Methode "void run()" vorschreibt. Auch wenn es meist im Zusammenhang mit Multithreading verwendet wird - man kann es auch anders benutzen.

z.B. wenn deine Item-Klasse - die wohl ein Menüitem darstellt? - eine "doClick" Methode hat (wird aufgerufen, wenn die Maus auf das Menü klickt), könnte man darin dann "action.run();" aufrufen. Weil Runnable ein Interface ist, kann sich dann dahinter so ziemlich jetzt Aktion verstecken die du willst.
 

Souljumper

Aktives Mitglied
Also hier mal meine ganze Klasse, die Klasse implementiert kein Interface....wirklich mehr informationen zum Thema Runnable hab ich auch nicht gegeben bekommen. halt der satz den ich oben gepostet hab, das es nichts mit multithreading zu tun haben soll.

Die klasse stellt wie der name vermutetn lässt, ein Menu da. In der Menu Klasse wird in der methode perform die innere klasse mit item.action.run(); verwendet und dazu was zu googeln hab ich halt nicht so recht hinbekommen, zumindest nicht ohne direkt auf das threading thema zu stoßen.

Code:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Einfache Menuestruktur.
 * Die Klasse erlaubt die Definition eines Menues und die Auswahl und
 * Ausfuehrung der Menueaktion.

 */
public class Menu 
{
    private static class Item 
    {
        String name;
        char key;
        Runnable action;

        public Item(String name, char key, Runnable action) 
        {
            this.name = name;
            this.key = key;
            this.action = action;
        }
        
        public String toString()
        {
            return key + " - " + name;
        }
    }

    private String title;
    private List items = new ArrayList();

    /**
     * Erzeugt ein neues Menue.
     * 
     * @param title Titelzeile
     */
    public Menu(String title) {
        this.title = title;
    }

    /**
     * Definiert eine (weitere) Menuezeile. Wenn das <code>action</code>
     * gleich <code>null</code> ist wird bei Auswahl dieses
     * Punktes anstelle einer Aktion die Menue-Schleife beendet.
     * 
     * @param name Beschreibung der Auswahl
     * @param key Kuerzel fuer die Auswahl (ein Buchstabe!)
     * @param action Aktionsobjekt
     * @see runnloop
     */
    public void add(String name, char key, Runnable action) {
        items.add(
                new Item(name, Character.toLowerCase(key), action));
    }

    /**
     * Stellt ein Menue dar und fuehrt die gewaehlten Aktionen aus.
     * Zunaechst wird der Menuetext auf den Bildschirm geschrieben.
     * Anschlie�end wird auf eine mit Return abgeschlossene Zeile gewartet, die
     * genau ein Zeichen enthaelt. Wenn definiert, wird die zu diesem Zeichen
     * gehoerende Aktion ausgefuehrt (Ansonsten wird nachgefragt). Wenn die
     * keine Aktion fuer den gewaehlten Item definiert ist,
     * wird die Menueabfrage beendet. Anderfalls wird erneut abgefragt.
     */
    public void runloop() {
        for (;;) {
            printList();
            String input = Keyboard.readLine(": ");
            if (input.length() != 1)
                System.err.println("nur 1 Buchstabe bitte");
            else {
                char c = Character.toLowerCase(input.charAt(0));
                if (perform(c)) return;
            }
        }
    }

    /**
     * Gibt die Menuepunkte aus.
     */
    private void printList() {
        System.out.println();
        System.out.println(title);
        for (Iterator iter = items.iterator(); iter.hasNext();)
            System.out.println(iter.next());
    }

    /**
     * Fuehrt die mittels c ausgewaehlt Aktion aus.
     * 
     * @param c Auswahlzeichen
     * @return true wenn die Menueschleife beendet werden soll.
     */
    private boolean perform(char c) {
        for (Iterator iter = items.iterator(); iter.hasNext();) {
            Item item = (Item) iter.next();
            if (item.key == c) {
                if (item.action != null) {
                    item.action.run();
                    return false;
                }
                return true;
            }
        }
        System.err.println("illegaler Buchstabe");
        return false;
    }
}
 
M

maki

Gast
Weil Runnable ein Interface ist, kann sich dann dahinter so ziemlich jetzt Aktion verstecken die du willst.
Selbst wenn es möglich ist, die korrekte Nutzung eines Interfaces ist aber etwas anderes ;)

Runnable zu nutzen nur um die run() methode Aufzurufen ist alles andere als schön imho.

@Souljumper,

schreibe eine Klasse die Runnable implementiert, d.h. die run() Methode implementiert.
 

tfa

Top Contributor
Dann ist es so, wie Beni vermutet hat. Trotzdem ist das IMHO ein Missbrauch von Runnable. In der Dokumentation steht klar, dass es für Threading benutzt werden soll. Für Actions im GUI-Bereich gibt es schon genug andere Klassen/Interfaces, die man benutzen kann.
 

ARadauer

Top Contributor
also was ist jetzt die konkrete Frage?

hab den code nur grob überflogen (schweine heiß im büro, so gut kann ich mich heute nicht mehr konzentrierren) also für mich ist das ein command pattern. die commands werden durch das runnable interface definiert und können ausgeführt werden.
es werden kommandos oder verhalten gekapselt.

die commandos werden als items hinzugefügt, name, zeichen zum ausführen und das kommando selber

wird nun was vom benutzer eingegeben wird in perform nach dme jeweilinge item mit dem charakter gesucht und das kommando ausgeführt.....

ist die frage, was das soll? ist meine antwort: command pattern

ich find den code eigentlich sehr gut und einleuchtend, das interface hätte er aber selber definieren sollen, bzw wenn erst getan hat, nicht runnable nennen....
 

Souljumper

Aktives Mitglied
ARadauer hat gesagt.:
also was ist jetzt die konkrete Frage?

ich soll mich über Runnable informaieren, was das ist wie es funktioniert. Es gab dazu die Anmerkung, dass es nichts mit Multi-Threading zu tun hat. Jetzt hab ich versucht diese Information zu ergoogeln, bin aber nur auf die Threadinginformationen gestoßen, die ich aber gemäß hinweis nicht gebrauchen kann. Daher war meine Frage was das jetzt mit dem Runnable in diesem Fall auf sich hat. Zudem die Klasse das Runnable interface ja gar nicht implementiert, weder die Äußereklasse, noch die Innere.

Also dieses Runnable action.run() führt jetzt was genau aus? da ich das interface runnable ja nicht verwende ist die aktion hinter action.run() welche ?
 

ms

Top Contributor
@Radauer
Deine Erklärung vom Command Pattern ist einleuchtend.
Ein Interface 'Command' mit einer 'execute'-Methode hätte es aber auch getan.
Da hier eindeutig java.lang.Runnable verwendet wird und die javadoc dazu ebenfalls eindeutig ist ist der Hinweis, dass Runnable nichts mit Multithreading zu tun hat bzw. der ganze Code völliger Schwachsinn und irreführend.

ms
 

ARadauer

Top Contributor
@ms stimmt, Command mit execute hätte es auch getan.


ich soll mich über Runnable informaieren, was das ist wie es funktioniert.
in dem konkreten fall, ein command pattern.
es wird verhalten gekapselt.

was das verhalten ist, kommt auf die implementierung an, wie maki schon gesagt hat.

du machst dir klassen die runnable implementieren und in den run methoden, machst du alle möglichen sachen, schweine zeichnen, wurzel ziehen, datei speichern... diese klassen kannst du dann dem menu hinzufügen und ausführen...
 

ARadauer

Top Contributor
Beispiel:
Code:
public class MenuTest {
	
	public static void main(String[] args) {
		Menu m= new Menu("Das ist ein Menu");
		m.add("Schwein", 's', new SchweinZeichner());
		m.add("Bier", 'b', new BierTrinker());
		
		m.runloop();
		
	}

}

Code:
public class SchweinZeichner implements Runnable{

	public void run() {
		System.out.println("jetzt wird ein Schwein gezeichnet");
		
	}

}

Code:
public class BierTrinker implements Runnable{

	public void run() {
	System.out.println("jetz wird bier getrunken");
		
	}
	

}

ausgabe
Das ist ein Menu
s - Schwein
b - Bier
:
b
jetz wird bier getrunken

Das ist ein Menu
s - Schwein
b - Bier
:
s
jetzt wird ein Schwein gezeichnet

Das ist ein Menu
s - Schwein
b - Bier
:

nett
 

ARadauer

Top Contributor
oder sorry blödsinn, ihr seit wahrscheinlich noch gar nicht soweit!!

die antwort ist: interface, Runnable ist ein interface, damit kann man schnittstellen definieren, sprich ich kann definieren, welche methoden klassen haben müssen.....
 

Illuvatar

Top Contributor
Edit: Wah ich werd alt, hab die zweite Seite gar nicht bemerkt ;) Passt jetzt hier nicht so ganz 100%ig

Von wegen "Missbrauch von Runnable"... ist dann SwingUtilities.invokeLater z.B. auch ein Missbrauch von Runnable? ;)
Imo ist alles, was ausgeführt werden kann ("to run") ein Runnable. Man braucht es eben selten an anderen Stellen als an Threads, und auch im geposteten Beispiel würde ich eher ein neues Interface schreiben, da die zu ausführenden Objekte ja evtl. mehr Gemeinsamkeiten haben als dass sie ausgeführt werden können.
Naja, das ist Offtopic :bae:

@OP: Ich weiß nicht, was dein action.run() ausführt. Dem Code von dir könnte man Objekte jeder beliebigen Klasse übergeben, die Runnable implementiert, also eine Methode public void run() enthält. Was das in deinem Fall für Objekte sind, steht da nicht. Vielleicht sollst du die ja selbst schreiben?
 

tfa

Top Contributor
Illuvatar hat gesagt.:
Von wegen "Missbrauch von Runnable"... ist dann SwingUtilities.invokeLater z.B. auch ein Missbrauch von Runnable? ;)
Kann man so sehen. Nicht alles, was von Sun kommt, ist gut und richtig. Es gibt noch viel größeren Mist in der Java Standard-API.
 

ARadauer

Top Contributor
Dein Beispiel hat aber eine Klasse wo das interface implementiert ist, mein gesamtes projekt jedoch nicht.
und du verwendest in deinem projekt das menu vom lehrer? dann wird das aber nicht funktionieren.

zum missbrauch von Runnable: ich kann mir vorstellen, dass der lehrer die schüler einfch auf das thema Interface heranführen möchte. Hat ein Beispiel wo Runnable vorkommt geschrieben, und sie sollen sagen was Runnable ist... tja ein interface, wenn er ein eigenes mitgibt, weis natürlich jeder gleich dass es um interfaces geht.....
 

Souljumper

Aktives Mitglied
ARadauer hat gesagt.:
Dein Beispiel hat aber eine Klasse wo das interface implementiert ist, mein gesamtes projekt jedoch nicht.
und du verwendest in deinem projekt das menu vom lehrer? dann wird das aber nicht funktionieren.

ja genau, die menu klasse war gegeben und wurde auch nicht ovn mir geändert. meine frag ist eigentlich was action.run jetzt genau macht? kann mir das keiner bearntworten? Das gesammte projekt hab ich ja in dem posting weiter oben verlinkt. wenn mir das jemand erklären könnte, warum das trotzdem funktioniert(die anwendung läuft ja - soweit ih das sehe auch richtig).
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
C Runnable Jar-File erzeugen Java Basics - Anfänger-Themen 14
topi relativer Pfad in einem Runnable JAR file Java Basics - Anfänger-Themen 12
krgewb Runnable JAR File Export Java Basics - Anfänger-Themen 11
javajoshi Problem mit zwei Threads und Arrays (Runnable) Java Basics - Anfänger-Themen 12
5 Welchen Sinn hat ein Runnable Java Basics - Anfänger-Themen 6
F Bild in ein Runnable Jar File packen (eclipse) Java Basics - Anfänger-Themen 2
G Moving Objects with Threads (implements Runnable) Java Basics - Anfänger-Themen 1
R Compiler-Fehler Runnable-Jar != Eclipse Java Basics - Anfänger-Themen 5
U Externe Library im non runnable jar File im eclipse Java Basics - Anfänger-Themen 1
K Runnable oder Keyadapter läuft falsch Java Basics - Anfänger-Themen 4
T Java Projekt als runnable jar file exportieren inklusive csv Dateien Java Basics - Anfänger-Themen 4
Helgon Unterschied runnable und normale jar Java Basics - Anfänger-Themen 6
Helgon Interface Runnable Frage / Schnittstellen allgemein Java Basics - Anfänger-Themen 3
6 JDK installieren Runnable Jar Files ausführen?! Java Basics - Anfänger-Themen 8
O Erste Schritte Runnable Jar <- Ordner Fehlen Java Basics - Anfänger-Themen 6
Y Threads extends Thread oder implements Runnable Java Basics - Anfänger-Themen 10
V Kein neuer Thread trotz Runnable Java Basics - Anfänger-Themen 4
F Icon der runnable jar ändern Java Basics - Anfänger-Themen 3
W KeyListener auf Applet mit Runnable Java Basics - Anfänger-Themen 4
S Bild-Resource in Runnable Jar Java Basics - Anfänger-Themen 15
T Thread oder Runnable? Java Basics - Anfänger-Themen 3
J new Runnable Java Basics - Anfänger-Themen 4
M FileWriter innerhalb runnable Jar Java Basics - Anfänger-Themen 8
M Jpg und wav datei pfadangabe bei Runnable Jar file Java Basics - Anfänger-Themen 2
? Oracle jpr runnable target Java Basics - Anfänger-Themen 2
R Threads / Interface Runnable Java Basics - Anfänger-Themen 7
A Frage zu Datenzugriff bei new Thread(new Runnable) Java Basics - Anfänger-Themen 8
U Projekt als Runnable Jar exportieren Java Basics - Anfänger-Themen 4
P probleme mir Runnable Jar Java Basics - Anfänger-Themen 5
E Zugriff aus einer Runnable auf die Oberklasse Java Basics - Anfänger-Themen 2
chik Problem mit der Runnable Methode Java Basics - Anfänger-Themen 3
StickToFreak Runnable + KeyListener? Java Basics - Anfänger-Themen 32
S Runnable jar "Could not find main class" Java Basics - Anfänger-Themen 8
F Alternativen zu runnable JAR? Java Basics - Anfänger-Themen 13
F Classpath: Wichtig für Runnable JAR? Java Basics - Anfänger-Themen 2
F Projektstruktur und runnable JAR! Java Basics - Anfänger-Themen 6
F Runnable JAR Programm kann nur über Konsole gestartet werden Java Basics - Anfänger-Themen 9
S runnable jar datei sql fehler Java Basics - Anfänger-Themen 5
G Innerhalb von Runnable auf super. zugreifen? Java Basics - Anfänger-Themen 3
Daniel_L Unterschied Thread und Runnable? Java Basics - Anfänger-Themen 8
W Aus einem Runnable-thread auf einen JFrame zugreifen Java Basics - Anfänger-Themen 5
frau-u Interface Runnable - wie funktionierts? Java Basics - Anfänger-Themen 3
S sleep ohne runnable? Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben