# Methoden in einem Thread ausführen



## bond (12. Nov 2004)

Hallo Leute,
bin gerade dabei von C++ auf Java umzusatteln, um einige Projekte in Java zu realisieren.

Jetzt habe ich eine einfache File-Logging-Klasse geschrieben und beabsichtige, die Schreibvorgänge auf die Festplatte in einen Thread auszulagern. Die Klasse ist im Moment Single-Threaded und funzt soweit perfekt. Jetzt wäre es ganz schön Threads zu benutzen, weil Plattenzugriff ja erfahrungsgemäß das Programm ausbremst.

Die Klasse hat allerdings zwei Methoden LogNotice() und LogError(). Füge ich in die Klasse eine run()-Methode ein, wird diese zwar ausgeführt, aber würde es nicht funktionieren die einzelnen Methoden LogNotice() und LogError() anzusprechen? Dieses run() in der Klasse erinnert mich an C, wo es noch keine Klassen gab. Prinzipiell kann ja nur diese eine Methode ausgeführt werden bei einem Thread (zumindest nach Meinung der einschlägigen Literatur, die das erstmal grundlegend erklären möchte). Finde ich ein bissel schade. Am besten wäre folgendes:


1. Klassenobjekt erzeugen und damit Thread starten
2. Aufruf der Methoden
3. Thread Ende

Ich hab hier was in der Richtung


```
Logger l = new Logger();

Thread t = new Runnable() {
    public void run() {
        l.LogNotice();
    }
}

t.start();
```

gesehen. Wäre das zu empfehlen?

Vielen Dank für Eure Aufmerksamkeit und Eure Hilfe,
bond


----------



## Beni (13. Nov 2004)

Die Definition der Schnittstelle zwischen Thread und Klassen (die Runnable implementieren) ist, dass "run" ausgeführt wird... das hat durchaus was mit OOP zu tun :wink:

Eine einfache Lösung ist, mit anonymen Klassen zu arbeiten:

```
public class Log{
  private synchronized void logNotice(){
    ...
  }

  public void startLogNotice(){
    new Thread(){
      public void run(){
         logNotice();
      }
    }.start();
  }
}
```

Du könntest auch die Befehle in Objekte umwandeln (eine entsprechende Klasse schreiben...), und in einer Queue speichern, welche von einem einzigen Thread abgearbeitet wird. Das wäre dann wohl auch ressourcenschonender, dafür hast du den Overkill gleich am Anfang :roll:


----------



## Sky (13. Nov 2004)

Ich würde die Daten in zwei Container packen (einmal Error und einmal Notice; hoffe ich hab das richtig verstanden). 
Ein neuer Thread bekommt dann die Referenz auf diese Daten-Container und fängt an diese sequenziell abzuarbeiten (am besten nach dem FIFO-Prinzip)


----------

