# Was ist "Runnable"?



## Souljumper (28. Mai 2008)

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.




```
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?


----------



## SlaterB (28. Mai 2008)

> Was ist/macht dieses Runnable?

-> 

> Threading/Multi-Threading


----------



## Beni (28. Mai 2008)

Dokumentation von Runnable


----------



## Souljumper (28. Mai 2008)

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.


----------



## maki (28. Mai 2008)

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


----------



## lhein (28. Mai 2008)

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


----------



## ms (28. Mai 2008)

Wie lautet denn der import für dein Runnable?

ms


----------



## Beni (28. Mai 2008)

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.


----------



## lhein (28. Mai 2008)

Stimmt...bin da inzwischen schon etwas betriebsblind geworden


----------



## Souljumper (28. Mai 2008)

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.


```
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;
    }
}
```


----------



## maki (28. Mai 2008)

> 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 (28. Mai 2008)

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.


----------



## ms (28. Mai 2008)

Möglicherweise sollen später die Aktionen in eigenen Threads laufen???
Trotzdem eigenartig.

ms


----------



## ARadauer (28. Mai 2008)

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 (28. Mai 2008)

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 ?


----------



## maki (28. Mai 2008)

> 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 ?


Das kommt auf deine Implementierung an.


			
				maki hat gesagt.:
			
		

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


----------



## ms (28. Mai 2008)

@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 (28. Mai 2008)

@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 (28. Mai 2008)

Beispiel:

```
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();
		
	}

}
```


```
public class SchweinZeichner implements Runnable{

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

}
```


```
public class BierTrinker implements Runnable{

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

}
```

ausgabe


> Das ist ein Menu
> s - Schwein
> b - Bier
> :
> ...



nett


----------



## ARadauer (28. Mai 2008)

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 (28. Mai 2008)

*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?


----------



## Souljumper (29. Mai 2008)

@ARadauer

Dein Beispiel hat aber eine Klasse wo das interface implementiert ist, mein gesamtes projekt jedoch nicht. ich hab mein projekt mal  verlinkt. evtl. kann mir einer sagen welche run-methode er da aufruft, den ich implementiere das interface niergendwo, rufe dennoch die run methode auf

http://rapidshare.de/files/39553967/ap2_4.jar.html


----------



## tfa (29. Mai 2008)

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 (29. Mai 2008)

> 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 (29. Mai 2008)

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).


----------



## Marco13 (29. Mai 2008)

SwingUtilities.invokeLater zielt doch auf Multithreading ab!?  ???:L Aber IMHO muss man das nicht so eng sehen  :roll:


----------

