Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Unterschied zwischen SwingWorker und "normalem" Th
kann mir jemand den Unterschied zwischen einem SwingWorker und einem "normalen" Thread erklären?
Mein bisheriges Wissen:
Mit Hilfe eines SwingWorkers lasses sich Methoden, die eine sehr lange Ausführungszeit haben können, so auslagern, dass sie nicht mehr im Event Dispatcher Thread laufen, sondern in einem eigenen Thread. Ist die Methode abgearbeitet, so wird done() aufgerufen und das Ergebnis kann verwendet werden.
Da ich leider noch nicht mit SwingWorkern arbeiten konnte (gibts erst ab Java6 und wir setzen noch 5 ein), kann ich nur meine Eindrücke anhand der JavaDoc wieder geben:
Thread ist recht "dumm", da er nur einen weiteren Prozess startet und sonst kaum Methoden anbietet.
SwingWorker dagegen bietet Methoden zum publizieren von Events (progress), sagt dir Bescheid wenn die Arbeit fertig ist bzw. kannst du mit der get Methode solange aufs Ergebnis warten, bis der Prozess beendet ist. Das müsste man bei Thread alles selber programmieren (concurrency oder selber mit synchronized). Bietet sich daher an SwingWorker zu verwenden wenn man Prozesse auslagern möchte, und gleichzeitig die GUI aktualisieren will. Bei der JavaDoc gibts eh schöne Beispiele
Intern verwendet der SwingWorker einen Pool von Threads, und wenn man swingWorker.execute() aufruft, wird dieser SwingWorker von einem Thread in diesem Pool ausgeführt - das ist erstmal nichts großartig anderes als ein Executor/ExecutorService.
Der SwingWorker bietet darüber hinaus aber einige praktische Methoden, die speziell gedacht sind für langwierige Aufgaben, die aus dem Event-Dispatch-Thread ausgelagert werden. Insbesondere die "publish" und "done"-Methoden die im EDT ausgeführt werden, und deswegen gefahrlos auf GUI-Komponenten zugreifen können. Die Alternative dazu wäre sowas verschachteltes wie
Code:
void actionPerformed(ActionEvent e) // Wird vom EventDispatchThread aufgerufen
{
Thread t = new Thread(new Runnable() // Auslagern AUS dem EventDispatchThread RAUS
{
public void run()
{
final String result = compute(); // Dauert lange - sollte NICHT im EDT gemacht werden
SwingUtilities.invokeLater(new Runnable() // Einlagern IN den EventDispatchThread REIN
{
public void run()
{
textField.setText(result); // GUI-Component wird verändert - MUSS i.a. vom EDT gemacht werden
}
});
}
});
t.start();
}