Pronux Wiki
Menu

RCPThreading

Swing und Threads

Falls man mehrere Threads in seiner Anwendung verwenden will, sollte man immer die Single Thread Regel beachten:
Sobald eine Swingkomponente realisiert wurde, sollte der gesammte Code, der den Zustand der Komponente beeinflusst oder davon abhängig ist, in einem event-dispatching Thread ausgeführt werden.

Das Updaten eines Spwingelements in einem anderen Thread als dem event-dispatching Thread wird zu Problemen führen (Flackern oder sogar ein möglicher Deadlock...)

Man muss die invokeLater(Runnable) oder die invokeAndWait(Runnable) Methoden der SwingUtilities Klasse nutzen um den Code in einem event-dispatching Thread laufen zu lassen.

Wie auch immer, es gibt verschiedene Möglichkeiten Multithreading in Swingapplikationen transparent zu nutzen.

Spin

Beispiel für Spin

public interface JobListener 
 {
 public void start();
 public void end();
 public void progress(int percentage);
 }
public class Job extends TimerTask 
{
 private ListenerListHelper listeners = new ListenerListHelper(JobListener.class);

 public void addJobListener(JobListener l) 
 {
  listeners.add(l);
 }

 public void removeJobListener(JobListener l) 
 {
  listeners.remove(l);
 }

 public void run() 
 {
  listeners.fire("start");
  ...
  listener.begin();
  for (...) 
  {
   ...
   listeners.fire("progress", new Integer(percentage));
  }
  ...
  listeners.fire("end");
 }
}
public class TestView extends AbstractView implements JobListener 
 {
  public void start() {
  getStatusBar().setMessage("Begin"); // And/or other Swing stuff
 }

 public void end() 
 {
  getStatusBar().setMessage("End"); // And/or other Swing stuff
 }

 public void progress(int percent) 
  {
   getStatusBar().setMessage("Completed " + percent); // And/or other Swing stuff
  }

 protected JComponent createControl() 
  {
   ...
  }

 public class LongRunningCommand extends ActionCommand 
  {
   public LongRunningCommand() 
   {
    super("longRunningCommand"); 
   }

 protected void doExecuteCommand() 
  {
   Job job = new Job();

   // use the Spin.over functionality
   job.addJobListener((JobListener) Spin.over(TestView.this));

   // execute the job
   ...
  }
 }
}

Go to top   Edit this page.   More info...   Attach file...

This page last changed on 10-Nov-2006 14:27:27 CET by 88.198.0.236.