29.4 Runnable als anonyme Klasse
 
  An dem Beispiel der Klassen X und DemoX, zeigen wir, wie man auf die Klasse X  verzichten kann und ihre Funktionalität als anonyme Klasse in DemoX integriert. Das Vorgehen ist immer dann interessant, wenn der Aufwand in der run()-Methode relativ klein ist.
Download:
DemoRunnable.java
 
public class DemoX{
  public static void main(String[] args){
    Runnable rs = new Runnable() {
     public void run(){
       schlafen(1000);
     }
    };
      
    Runnable rt = new Runnable(){
      public void run(){
        schlafen(3000);
      }
    };
      
    Thread s = new Thread(rs,"Thread Nr. 1");
    Thread t = new Thread(rt,"Thread Nr. 2");
    s.start();
    t.start();
  }
   
  private static void schlafen(){
    for (int i = 1; i<=10; i++){
      try{
        Thread.sleep((int)(Math.random()*1000));
        System.out.println(Thread.currentThread().getName()
                            +": "+i);
     }
      catch(InterruptedException exp){
        return;
      }
    }
  }
}
  Da Runnable ein Interface und damit eine abstrakte Klasse ist, lässt sich von ihr keine Instanz direkt erzeugen. Eine Zeile wie

Runnable rs = new Runnable();

wird vom Compiler nicht übersetzt. Er meldet einen Fehler. Der Grund liegt darin, dass man so keine Chance hat, die in Runnable abstrakte Methode run() zu implementieren. Der gelb unterlegte Text zeigt, wie man sich behelfen kann:

Runnable rs = new Runnable()/*hier run implementieren*/;

Da dies nun zwei mal passieren müsste, haben wir in die run()-Methode nur einen Aufruf einer Methode schlafen() programmiert und schlafen() als statische Methode neben der Main-Methode implementiert. Sie enthält nahezu den gleichen Quelltext, wie die run()-Methode aus dem letzten Kapitel. Wir haben lediglich noch eine Parameterübergabe implementiert, um die Flexibilität noch deutlicher zu machen

   
zu 29.5 Übungen
zur Startseite www.pohlig.de  (C) MPohlig 2006