Wie handle ich Threads am besten?

juandeluca

Mitglied
Hallo,

ich habe ein Java-Programm, in welchem ich Swing für die GUI benutze.

Nun gibt es ein paar Sachen, die ich gerne gleichzeitig machen und dessen Status anzeigen will. Z.B. einen Download mit Ladebalken oder die erstellung eines ZIPs und den Fortschrittsbalken oder die Verbindung zu einer Datenbank ohne eingefrohrenem Bildschirm.

Jetzt ist die Frage wie ich das machen soll. Dafür bin ich hier! 🙂
Meine bisherige Idee war es auf jede Form einen Timer zu setzen, den ich beispielsweise auf 30 frames per second setze. Neben diesem immer laufenden Prozess lasse ich dann alle anderen nötigen Prozesse laufen, die dann ihren Status immer in eine Liste eintragen, aus welcher sich der Timer immer die aktuellen Zahlen und Daten für seine GUI holt.

Ist dieser Ansatz richtig bzw. gut? Gäbe es bessere Ansätze?
 
Hm, ich hab hier mal was geschrieben, schau mal, nach einiger Zeit wird das immer genauer:

Java:
package javaforum;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class WebsiteLaden {

    private JProgressBar progress = new JProgressBar();
    private int cnt = 1;
    private int sum = 999;

    public WebsiteLaden() {

        progress.setStringPainted(true);

        JFrame f = new JFrame("WebsiteLaden");
        f.add(progress);
        f.pack();
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.setVisible(true);

        new Thread(new Runnable() {

            int c = 999;

            public void run() {
                try {
                    while (true) {
                        cnt++;
                        sum += c;
                        c = 0;
                        progress.setMaximum(Math.round(sum / cnt));

                        InputStream is = null;
                        try {
                            is = new URL("http://de.wikipedia.org/wiki/Spezial:Zuf%C3%A4llige_Seite").openStream();
                            int i;
                            while ((i = is.read()) != -1) {
                                System.out.print((char) i);

                                c++;
                                SwingUtilities.invokeLater(new Runnable() {

                                    public void run() {
                                        progress.setValue(c);
                                    }
                                });
                            }
                        } finally {
                            if (is != null) {
                                is.close();
                            }
                        }

                        Thread.sleep(1000L);
                    }
                } catch (MalformedURLException mue) {
                    System.out.println(mue);
                } catch (IOException ioe) {
                    System.out.println(ioe);
                } catch (InterruptedException ine) {
                    System.out.println(ine);
                }
            }
        }).start();
    }

    public static void main(String[] args) {
        new WebsiteLaden();
    }
}

Trotzdem sollte man Listener nehmen.

Grüßle
 

Neue Themen


Zurück
Oben