Ausführung im Hintergrund - Unterschiedliche Methoden

Igor1312

Mitglied
Hi,

im Thread Ausgabe von Zwischenergebnissen ist eine Methode für Hintergrundtasks beschrieben worden. Hier ist eine andere, die aber nicht richtig funktioniert ;)

Das Ding läuft zwar im Hintergrund und ich erhalte eine live-Ausgabe im Textfeld der GUI, jedoch gelingt es mir nicht, den Wert von i ebenfalls auszugeben.
Außerdem wird der Statusbalken in der GUI nicht aktualisiert, warum nur?

Code:
@Action public void machet() {
    final int z;
    z = myView.getZaehler();
    new Thread() {
        @Override
        public void run() {
            // rechen- oder zeitintensive Befehle ausfuehren...
            for (int i = 1; i <= z; i++){
                System.out.println("machet: " + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(MachwasApp.class.getName()).log(Level.SEVERE, null, ex);
                }
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        // Aenderungen an der GUI vornehmen...
                        myView.setTextfeld("machet: "  + "\n");
                    }
                }  // Runnable()
                ); // invokeLater()
            } // for
        // sonstige Befehle ausfuehren...
        } // Thread.run
    }.start();  // thread()
} // machet()

Und angenommen, das ist nur eine Kleinigkeit für euch Cracks, was ist der Unterscheid zwischen dieser Methode und der im anderen o.g. Thread?
Ich fände diesen Code hier schöner und handlicher, als den anderen, wenn er denn funktionieren würde ;)

Tschö,
Igor
 
Zuletzt bearbeitet:
hey Igor!

Hab jetzt nichts ausprobiert oder so, aber ich würde es folgendermaßen angehn:

erstmal würd ich den Thread in eine eigene Klasse packen.

Java:
public class MyThread implements Runnable
{
    @Override
    public void run()
    {
        // Do here something
    }
}

in deiner Method machst du nun:
Java:
Thread t = new Thread(MyThread);
t.start();

Das mit dem invokeLater würd ich persönlich garnicht machen, da das ja sowieso in einem eigenen Thread ist. Sollte mans trotzdem so machen, würd ich eine globale Variable anlegen:
Java:
int i = 0;

public void machet()
{
    for(i=1;i<z;i++)
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                sysItOut();
            }
        });
    }
}

private void sysItOut()
{
    System.out.println("machet: " + i + "\n");
}


greez THEJS

PS: Zu deiner Frage: http://de.wikipedia.org/wiki/Thread_(Informatik)
 
Zuletzt bearbeitet:
Zurück