Threads

Status
Nicht offen für weitere Antworten.

purzelbaum_m

Aktives Mitglied
Hilfe..

das mit den Threads.. das find ich echt schwer.. ich habe folgendes Problem.. meine Code ist folgendermaßen:

Code:
        this.sendData("/tableStore");
        Vector datas = new Vector();
        datas = this.waitForData();
        boolean alreadyHere = false;
        while (!alreadyHere){
            if (datas.isEmpty()) {
                datas = this.waitForData();
            } else {
                alreadyHere = true;
            }
        }
Hierbei warte ich auf Daten vom Server... der macht allerdings eine ziemlich große Abfrage.. und das kann dauern (deswg. frag ich auch in der Schleife immer wieder nach - ober er jetzt endlich fertig ist..)

während dessen hätte ich gerne eine Progressbar.. damit es dem User vor dem Bildschirm ned langweilig wird..
also schrieb ich


Code:
    public void progressBar(){
        System.out.println("progress Bar");

        t = new Thread(new Runnable() {
            public void run() {
    
                JFrame frame = new JFrame("Please wait for a moment");
                Container cont = frame.getContentPane();
                cont.setLayout(new BorderLayout());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                JProgressBar bp = new JProgressBar();
                bp.setIndeterminate(true);
                JLabel message = new JLabel("  The Search is running....");
                cont.add(message, BorderLayout.NORTH);
                cont.add(bp, BorderLayout.CENTER);
                frame.setLocation(300, 250);
                frame.setSize(300, 70);
                frame.setVisible(true);
            }
        });
        t.start();

    }

und im obigen Code habe ich dann davor geschrieben:
Code:
this.progressBar();

Der zeigt mir auch schön das Frame an.. nur leider bewegt sich die ProgressBar erst dann.. wenn die Abfrage irgendwann vorbei ist und die Daten da sind.. warum??

vielen Dank
 

Wildcard

Top Contributor
Moment, moment...
Versteh ich das jetzt richtig? Du erzeugst einen neuen Thread für einen JFrame anzuzeigen, und der Code der die eigentliche Arbeit macht läuft im EventDispatcher, oder wie? ???:L
Kommt mir so vor als würdest du das Pferd von hinten aufzäumen.
 

purzelbaum_m

Aktives Mitglied
keine Ahnung was ich da genau mache :)

ich will, während mein Hauptprogramm nach den Daten ausschau hält, nur, das ein Fenster angezeigt wird... in dem sich was bewegt *g*..

also habe ich mir ein JFrame gebastelt, mit einer JProgressBar, die immer hin und her pendelt..

nur läuft des bei mir ned 'parallel' :( sondern nach einander.. zuerst das JFrame. dann wartet er, dann hat er die Daten und dann fängt er erst an hin und her zu pendeln.. ???:L
 

Wildcard

Top Contributor
Ich sag dir mal wie's normalerweise läuft:
Du startest aus dem main-Thread heraus einen JFrame/JDialog/...
Damit wird dann auch der EventDispatcher Thread gestartet.
Dieser ist unter anderem für's Zeichnen zuständig.
Wenn du dann etwas arbeitsintensives machen musst, eröffnest du einen neuen Thread damit du während dieses Vorgangs den EventDispatcher nicht blockierst.
Bei dir ist es jetzt aber andersrum ???:L
Verwendest du noch andere Oberflächenelemente in deinem Programm?
 

purzelbaum_m

Aktives Mitglied
ah... verstehe..
ähm.. was ist ein EventDispatcher, so im Groben nur?

Meine Methode sieht folgendermaßen aus:
Ich habe eine Tabelle, die mir alle Geräte anzeigen soll, die noch zur Verfügung stehen... (ist ein JApplet)
der Server wird mit this.sendData("/tableStore"); dazu aufgefordert diese herauszusuchen und zu schicken.. aber da das ja dauert..

Code:
    public void showAllStoredDevices(){
        System.out.println("Show all stored devices");

        this.insideSearch = false;
        this.insideAllStoredDevices = true;
        this.contSearch.setVisible(false);
        this.iBack = 11;

        this.contStoredDevices = new JPanel();
        this.contStoredDevices.setLayout(null);

        Vector colheads = new Vector();
        colheads.add("Edit");
        colheads.add("Device");
        colheads.add("Device-ID");
        colheads.add("Software Version");
        colheads.add("Series");
        colheads.add("In/Out");
        
        this.progressBar("test");
        
        this.sendData("/tableStore");
        Vector datas = new Vector();
        datas = this.waitForData();
        boolean alreadyHere = false;
        while (!alreadyHere){
            if (datas.isEmpty()) {
                datas = this.waitForData();
            } else {
                alreadyHere = true;
            }
        }

        t.interrupt();
        System.out.println("searchall: " + datas.toString());

        Vector rowData = new Vector();
        Vector temp = new Vector();
        temp.add(new Boolean(false));
        for (int i = 0; i < datas.size(); i++) {
            if (((String) datas.get(i)).equals("==")) {
                rowData.add(temp);
                temp = new Vector();
                temp.add(new Boolean(false));
            } else {
                String str = new String();
                str = (String) datas.get(i);
                temp.add(str);
            }
        }

        this.tAllStoredDevices = new JTable();
        this.tAllStoredDevices = new JTable(new CustomModel(rowData,colheads));
        this.tAllStoredDevices.setAutoResizeMode(this.tHistoryUser.AUTO_RESIZE_LAST_COLUMN);
        JScrollPane sp = new JScrollPane(this.tAllStoredDevices, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        sp.setBounds(10,70,780,490);
        this.tAllStoredDevices.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
        AutofitTableColumns atc = new AutofitTableColumns();
        atc.autoResizeTable(this.tAllStoredDevices, false, 20);

        Integer tableSize = this.tAllStoredDevices.getRowCount();

        JLabel lTitel = new JLabel("All stored devices: (" + tableSize.toString()+")");
        lTitel.setBounds(10, 10, 200, 40);
        lTitel.setFont(new Font("Ariel", 3, 14));


        this.bBackToMainMenuFromSearch = new JButton("Back");
        this.bBackToMainMenuFromSearch.setBounds(10,570,100,20);
        this.bBackToMainMenuFromSearch.addActionListener(this);

        this.bDetailsFromStoredDevices = new JButton("Details");
        this.bDetailsFromStoredDevices.setBounds(230,570,100,20);
        this.bDetailsFromStoredDevices.addActionListener(this);

        this.bUnitaryEditFromStoredDevices = new JButton("Unitary Edit");
        this.bUnitaryEditFromStoredDevices.setBounds(130,570,100,20);
        this.bUnitaryEditFromStoredDevices.addActionListener(this);

        this.contStoredDevices.add(lTitel);
        this.contStoredDevices.add(this.bBackToMainMenuFromSearch);
        this.contStoredDevices.add(sp);
        this.contStoredDevices.add(this.bUnitaryEditFromStoredDevices);
        this.contStoredDevices.add(this.bDetailsFromStoredDevices);

        this.setContentPane(this.contStoredDevices);
        this.setSize(800, 600);
    }

also müsste ich das warten in den Thread setzen?
sprich:

Code:
        Vector rowData = new Vector();
        Vector temp = new Vector();
        temp.add(new Boolean(false));
        for (int i = 0; i < datas.size(); i++) {
            if (((String) datas.get(i)).equals("==")) {
                rowData.add(temp);
                temp = new Vector();
                temp.add(new Boolean(false));
            } else {
                String str = new String();
                str = (String) datas.get(i);
                temp.add(str);
            }
        }

nur wie kann ich, wenn ich das in ein Thread packe.. dann auf die Daten rowData zugreifen..?? - verstehst du wie ich das meine? (sorry das ich mich ned so toll ausdrücken kann.. dazu fehlt mir das wissen)[/quote]
 

Wildcard

Top Contributor
Der EventDispatcher regelt alle Events und die Zeichenqueue. Im groben jedenfalls :wink:
Ja, genau. Das Warten muss in einen anderen Thread, und die ProgressBar muss im EventDispatcher Thread laufen.
Kannst du deine letzte Frage etwas konkretisieren?
 

AlArenal

Top Contributor
Alles was mit AWT und Swing zu tun hat, muss aus dem EDT aufgerufen werden, sonst handelst dur dir nur Probleme ein. Foxtrot ist dafür ziemlich cool.

Code:
Vector datas = (Vector) Worker.post(new Job() {
  public Object run() {
    return waitForData();
  }
});

Siehe: http://www.javalobby.org/eps/galbraith-swing-2/
Das JAR der aktuellen 3.0beta1 ist 32 KB klein. Das lässt sich in jedem Fall verschmerzen - jedenfalls besser als die Kopfschmerzen, sich händisch mit Threads rumzuschlagen.
 

purzelbaum_m

Aktives Mitglied
ok, jetzt verstehe ich das schon ein bisschen besser..

was für ein Development Tool nimmt den der in der Javalobby her? und gibt es da noch mehr Videos??

@Wildcard
wenn ich ein ganz normalen Thread habe:

Code:
        t = new Thread(new Runnable() {
            public void run() {
   
                   String str = new String ("");
                   String str2 = new String("");
                   for (int i = 0; i < 10; i ++){
                       str = str + " " + str2;
                   }

            }
        });
        t.start();

und der hat ein Ergebnis.. wie hier jetzt zum Beispiel str.. wäre ja dann irgendwann.. aaaa...
und diese Variable bzw. den "errechneten" Wert möchte ich dann, nachdem der Thread abgelaufen ist, wieder verwenden.. dann muss ich den Wert ja irgendwie übergeben.. aber wie mache ich das - wenn ich nicht Foxtrot hernehme..

vielen Dank
 

Wildcard

Top Contributor
Das machst du in dem du dem Thread eine Referenz auf irgendwas gibst. Dort meldet sich der Thread dann sobald er fertig ist.
 

purzelbaum_m

Aktives Mitglied
worin liegt der Unterschied zwichen IE Explorer und dem "internen Browser" meiner Entwicklungsumgebung, also ich habe JBuilder..

Denn beim IE funktioniert das ned. also es wird nichts angezeigt.. beim JBuilder, einwandfrei.. echt komisch..
 

Wildcard

Top Contributor
Ein unsigniertes Applet unterliegt strengen Restriktionen was Verbindungsaufbau, Festplattenzugriff, etc. angeht.
Was genau machst du mit dem Applet?
 

purzelbaum_m

Aktives Mitglied
Ne, an den rechten kann es nicht liegen, hab sie in der policy alle ausgeschalten *g*

So gehts jetzt...
nur warum muss ich zuerst die GUI dem Content adden und anzeigen und kann erst dann den Thread laufen lassen und dann die GUI sprich mein JTable "updaten"..

hatte mein Thread zuerst an der Stelle "hier" und wollte die Tabelle gleich mit all den Werten erstellen.. aber da zeigt er mir garnichts an.. nicht mal den Titel...

Code:
    public void showAllStoredDevices(){
        System.out.println("Show all stored devices");

        this.insideSearch = false;
        this.insideAllStoredDevices = true;
        this.contSearch.setVisible(false);
        this.iBack = 11;
        
        // Window mit JProgessBar
        JFrame fr = new JFrame("Please wait for a moment");
        Container cont = fr.getContentPane();
        cont.setLayout(new BorderLayout());
        //fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JProgressBar bp = new JProgressBar();
        bp.setIndeterminate(true);
        JLabel message = new JLabel("  The Search is running....");
        cont.add(message, BorderLayout.NORTH);
        cont.add(bp, BorderLayout.CENTER);
        fr.setLocation(300, 250);
        fr.setSize(300, 70);
        fr.setVisible(true);      

        //--------HIER------

        // Layout
        this.contStoredDevices = new JPanel();
        this.contStoredDevices.setLayout(null);

        Vector colheads = new Vector();
        colheads.add("Edit");
        colheads.add("Device");
        colheads.add("Device-ID");
        colheads.add("Software Version");
        colheads.add("Series");
        colheads.add("In/Out");

        JLabel lTitel = new JLabel("All stored devices: (0)");
        lTitel.setBounds(10, 10, 200, 40);
        lTitel.setFont(new Font("Ariel", 3, 14));


        this.bBackToMainMenuFromSearch = new JButton("Back");
        this.bBackToMainMenuFromSearch.setBounds(10,570,100,20);
        this.bBackToMainMenuFromSearch.addActionListener(this);

        this.bDetailsFromStoredDevices = new JButton("Details");
        this.bDetailsFromStoredDevices.setBounds(230,570,100,20);
        this.bDetailsFromStoredDevices.addActionListener(this);

        this.bUnitaryEditFromStoredDevices = new JButton("Unitary Edit");
        this.bUnitaryEditFromStoredDevices.setBounds(130,570,100,20);
        this.bUnitaryEditFromStoredDevices.addActionListener(this);

        this.contStoredDevices.add(lTitel);
        this.contStoredDevices.add(this.bBackToMainMenuFromSearch);
        //this.contStoredDevices.add(sp);
        this.contStoredDevices.add(this.bUnitaryEditFromStoredDevices);
        this.contStoredDevices.add(this.bDetailsFromStoredDevices);

        this.setContentPane(this.contStoredDevices);
        this.setSize(800, 600);
    
        // Order datas
        this.sendData("/tableStore");
        Vector datas = (Vector) Worker.post(new Job() {
            public Object run() {
                Vector datas = waitForData();
                boolean alreadyHere = false;
                while (!alreadyHere) {
                    if (datas.isEmpty()) {
                        datas = waitForData();
                    } else {
                        alreadyHere = true;
                    }
                }
                return datas;
            }
        });
        fr.setVisible(false);
    
        System.out.println("searchall: " + datas.toString());
    
        Vector rowData = new Vector();
        Vector temp = new Vector();
        temp.add(new Boolean(false));
        for (int i = 0; i < datas.size(); i++) {
            if (((String) datas.get(i)).equals("==")) {
                rowData.add(temp);
                temp = new Vector();
                temp.add(new Boolean(false));
            } else {
                String str = new String();
                str = (String) datas.get(i);
                temp.add(str);
            }
        }
        
        // JTable
        CustomModel cm = new CustomModel(rowData,colheads);
        this.tAllStoredDevices = new JTable(cm);
        this.tAllStoredDevices.setAutoResizeMode(this.tHistoryUser.AUTO_RESIZE_LAST_COLUMN);
        JScrollPane sp = new JScrollPane(this.tAllStoredDevices, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
                                                          JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        sp.setBounds(10,70,780,490);
        this.tAllStoredDevices.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
        AutofitTableColumns atc = new AutofitTableColumns();
        atc.autoResizeTable(this.tAllStoredDevices, false, 20);  
        Integer tableSize = this.tAllStoredDevices.getRowCount();        
        this.contStoredDevices.add(sp);
        lTitel.setText("All stored devices: ("+tableSize+")");

    }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
C Threads und Swing Java Basics - Anfänger-Themen 9
berserkerdq2 Wo finde ich in der Java Api die Notation zu Threads bezüglich Synchronized? Java Basics - Anfänger-Themen 14
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
B Monitor als Schranke von Threads Java Basics - Anfänger-Themen 20
W Threads Alphabet Java Basics - Anfänger-Themen 20
H Threads Anfänger Java Basics - Anfänger-Themen 17
G Threads parallel laufen Java Basics - Anfänger-Themen 11
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
M Threads Java Basics - Anfänger-Themen 12
L Threads Synchronisierung zwischen threads Java Basics - Anfänger-Themen 4
M Threads Java Basics - Anfänger-Themen 2
A Threads Java Basics - Anfänger-Themen 9
A Threads Java Basics - Anfänger-Themen 13
A Threads und .join Java Basics - Anfänger-Themen 14
W Threads starten Java Basics - Anfänger-Themen 2
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
J Wieviele threads? Java Basics - Anfänger-Themen 9
J Problem bei seriellem Start von Threads Java Basics - Anfänger-Themen 11
O Threads Java Basics - Anfänger-Themen 2
L Buchungssystem und Threads Java Basics - Anfänger-Themen 2
O Threads - Synchronize(), join(), wait(), notify(), yield() Java Basics - Anfänger-Themen 6
L Klassen NFC Reader und JavaFx Problem -> threads? Java Basics - Anfänger-Themen 2
A Kommunikation zwischen nebenläufigen Threads Java Basics - Anfänger-Themen 4
S Gemeinsame Ressource und Mehrfachinstanziierung von Threads Java Basics - Anfänger-Themen 16
S Verklemmung Threads Java Basics - Anfänger-Themen 11
B Threads 2 Threads gleichzeitig laufen lassen Java Basics - Anfänger-Themen 1
M Threads Threads laufen sequenziell, statt gleichzeitig. Java Basics - Anfänger-Themen 9
M Threads run Methode Java Basics - Anfänger-Themen 4
javajoshi mehrere Threads: Methoden zentral unterbringen Java Basics - Anfänger-Themen 8
javajoshi Problem mit zwei Threads und Arrays (Runnable) Java Basics - Anfänger-Themen 12
L Threads Mit Threads JLabel ändern! Java Basics - Anfänger-Themen 2
K Matrixen berechnen nach Worker Master Paradigma mit Threads Java Basics - Anfänger-Themen 4
S Kleine Frage zu Threads Java Basics - Anfänger-Themen 3
M Mit 2 Threads eine Zahl hochzählen Java Basics - Anfänger-Themen 13
T Threads Synchronisieren Java Basics - Anfänger-Themen 6
D Frage Threads Java Basics - Anfänger-Themen 6
Z Threads Executor Framework - Aufgabe auf n Threads aufteilen Java Basics - Anfänger-Themen 10
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
kilopack15 Mehrere Threads in einer Klasse Java Basics - Anfänger-Themen 8
H Threads funktionieren nicht Java Basics - Anfänger-Themen 4
J Aufgabe(Threads) richtig verstanden/implementiert Java Basics - Anfänger-Themen 27
R Threads aufeinander warten lassen? Java Basics - Anfänger-Themen 10
T Threads Durch threads gestartete Prozesse killen Java Basics - Anfänger-Themen 2
J Threads Java Basics - Anfänger-Themen 38
D Alte Klausuraufgabe Threads Java Basics - Anfänger-Themen 10
A Threads Threads bestimmte Aufgaben zuweisen... Java Basics - Anfänger-Themen 3
R Threads in JavaFX Java Basics - Anfänger-Themen 3
E Threads Doppelte Threads beenden Java Basics - Anfänger-Themen 4
F Sicheres Zurückmelden aus Threads Java Basics - Anfänger-Themen 0
G Threads zum Thema Threads??? null Ahnung Java Basics - Anfänger-Themen 4
Q Threads Threads in Swing Anwendungen Java Basics - Anfänger-Themen 5
J ConcurrentCalculation Multi Threads in Java Java Basics - Anfänger-Themen 3
P Threads Trotz Threads wird nur 1 Prozessorkern ausgelastet Java Basics - Anfänger-Themen 7
M "restartable" threads Java Basics - Anfänger-Themen 11
M Threads - summieren Java Basics - Anfänger-Themen 13
W Klassen Variable einer anderen Klasse ändern (Threads) Java Basics - Anfänger-Themen 3
E Threads - Programm analysieren Java Basics - Anfänger-Themen 2
E join() bei zwei Threads Java Basics - Anfänger-Themen 2
T Threads Threads richtig synchronisieren Java Basics - Anfänger-Themen 3
D [Concurrency/Threads] Code Umsetzung Schriftlich Java Basics - Anfänger-Themen 2
D Threads Java Basics - Anfänger-Themen 4
M Threads nio Dateien kopieren, Threads und Gui Java Basics - Anfänger-Themen 0
N Verweise auf Variablen in verschiedenen Threads Java Basics - Anfänger-Themen 4
T Java-Threads Java Basics - Anfänger-Themen 0
G Moving Objects with Threads (implements Runnable) Java Basics - Anfänger-Themen 1
F Threads funktionieren auf JPanel nicht Java Basics - Anfänger-Themen 1
M Problem mit Threads Java Basics - Anfänger-Themen 11
M Threads - wo gehören sie hin? Java Basics - Anfänger-Themen 3
S 2D-Spiel mit Threads... Java Basics - Anfänger-Themen 3
J Threads Java Basics - Anfänger-Themen 3
F ExecutorService und offene Threads Java Basics - Anfänger-Themen 3
P Threads Threads nicht nebenläufig Java Basics - Anfänger-Themen 7
M Threads nicht nebenleblaufig Java Basics - Anfänger-Themen 2
B Threads parallel zur main Java Basics - Anfänger-Themen 3
M Threads Java Basics - Anfänger-Themen 2
M Threads, zwei methoden gleichzeitig laufen lassen Java Basics - Anfänger-Themen 4
M Threads und Methodenübergreifender Variablezugriff Java Basics - Anfänger-Themen 2
J Wie handle ich Threads am besten? Java Basics - Anfänger-Themen 2
H Threads Java Basics - Anfänger-Themen 10
B synchronized threads Java Basics - Anfänger-Themen 17
E Mehrmaliges Ausführen eines Threads Java Basics - Anfänger-Themen 5
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Alle Threads .notify() Java Basics - Anfänger-Themen 13
R Threads Verständnisschwierigkeit Java Basics - Anfänger-Themen 2
J Können mehere Threads parallel eine Datei lesen? Java Basics - Anfänger-Themen 4
G Methoden in Threads wandeln Java Basics - Anfänger-Themen 7
H Threads Java Basics - Anfänger-Themen 17
F Java Concurrency - Threads Java Basics - Anfänger-Themen 4
V Threads Threads synchronisieren Java Basics - Anfänger-Themen 4
T Threads Join() = Block? oO Java Basics - Anfänger-Themen 4
J Threads ArrayList Problem bei Threads Java Basics - Anfänger-Themen 3
C Objekte durchschleifen / Threads Java Basics - Anfänger-Themen 2
J Threads stoppen mit interrupt - Frage dazu Java Basics - Anfänger-Themen 7
N Pingen in Threads Java Basics - Anfänger-Themen 9
B Threads benutzen Java Basics - Anfänger-Themen 5
E Allgemein Verständnissfrage zum Ablauf mehrerer Threads Java Basics - Anfänger-Themen 4
S Threads erzeugen Java Basics - Anfänger-Themen 11
K Threads Nur 2 von 3 Threads funktionieren Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben