Threads - aber wie?

Status
Nicht offen für weitere Antworten.

j-look

Mitglied
Hallo Forum,

ich habe ein Programm mit GUI, das ein Datenbankergebnis in einer while-Schleife verarbeitet. Das ganze erfolgt auf Knopfdruck und innerhalb der while-Schleife können weitere Datenbankanfragen auftreten. Die eigentlichen Berechnungen werden also von mehreren Methoden durchgeführt und können mehrere Minuten dauern.

Nun würde ich gerne einen Abbruch-Button einführen und überhaupt dafür sorgen, dass die GUI währenddessen nicht blockiert ist. Dass das mit Threads geht, weiß ich. Und ich kenne auch Beispiele (wie hier).
Leider sehe ich keine Möglichkeit diese einfachen Fälle auf meine Anwendung zu übertragen.

Ich würde mich freuen, wenn ihr mir in ein, zwei Sätzen Tipps geben oder Lösungsansätze skizzieren könntet.

Vielen Dank.
 

hdi

Top Contributor
Leider sehe ich keine Möglichkeit diese einfachen Fälle auf meine Anwendung zu übertragen.

Naja, ich kenn jetzt deine Anwendung nicht, aber so wie es klingt sollte das doch kein Problem sein?

Beim Klick auf den Button, der die Anfrage startet, wird ein neuer Thread gestartet,
so wie in diesen einfachen Beispielen.

Innerhalb dieses Threads werden die Datenbankabfragen beabeitet, und deine GUI
läuft weiter. Allerdings ist das bei GUI's oft etwas problematisch.
Schon mal was vom Event Dispatch Thread gehört? Auf diesen solltest du deine
GUI per invokeLater() legen, damit das auch alles funktioniert:


[HIGHLIGHT="Java"]
// wahrscheinlich in der main-Methode:
SwingUtilites.invokeLater(new Runnable(){
@Override
public void run(){
new meineGui().setVisible(true);
}
}[/HIGHLIGHT]

Und dann hast du noch einen Abbruch-Button. Dieser Button setzt zB ein boolean.

So á la:

click on abort -> shouldAbort = true;

dieser boolean shoudlAbort wird von deinem Anfrage-Thread genutzt.
Seine while-Schleife sieht so aus:

[HIGHLIGHT="Java"]while(!shouldAbort && deineBedingung ){...}[/HIGHLIGHT]

D.h. der Thread bricht ab und verlässt seine run-Methode wenn du auf abort drückst.
Jetzt ist natürlich die Frage inwiefern du mitten in der Anfrage das machen kannst.
Musst halt diese Abfrage an geeigneten Stellen einbauen, damit er möglichst schnell
mitbekommt, dass er aufhören soll.

Ansonsten sollte das eig. kein grosses Problem sein.
 

musiKk

Top Contributor
Naja, kommt drauf an, das geht auch.

Das boolesche Flag nützt einem, wie im Hinweiskasten beschrieben, bei sleep() und join() nichts. Mittels interrupt() wird das dort mit einer entsprechenden Exception beendet.
 

j-look

Mitglied
Danke für eure Antworten.
Bei den einfachen Beispielen klappt das mit der Boolean-Variable und dem Button. Das ist nicht das Problem. Das Problem ist viel eher, dass der Button wie auch die gesamte GUI blockiert ist.

Wenn ich meine Methode in einen Thread packe, läuft das zwar über meinThread.start(), aber die GUI bleibt blockiert. Ich skizziere mal kurz:
Code:
public class MeinThread extends Thread {
   public void run() {
      Runnable r = new Runnable() {
         public void run() {
             ...
             Schleife mit DB-Abfragen ...
             ... und diversen static-class-Aufrufen ...
             ... ein Schleifendurchgang kann viele Sekunden dauern
             ...
         }
         while (isMeinThreadStarted()) {
            MeineGUI.getDisplay().asyncExec(r);
            try {
               sleep(0);
            }catch(InterruptedException e) {}
         }
      }
   }
}
 
Zuletzt bearbeitet:
S

SlaterB

Gast
liegt vielleicht an seltsamen Dingen wie
> meineGUI.getDisplay().asyncExec(r);

was soll dazu ein Unwissender sagen?
wenn r vom AWT-Thread ausgeführt wird, dann ist nix gewonnen,

wie der Thread meinThread (Klassen groß schreiben!) vom ActionListener aufgerufen wird, ist auch nicht zu sehen
 

j-look

Mitglied
liegt vielleicht an seltsamen Dingen wie
> meineGUI.getDisplay().asyncExec(r);

was soll dazu ein Unwissender sagen?
wenn r vom AWT-Thread ausgeführt wird, dann ist nix gewonnen,

wie der Thread meinThread (Klassen groß schreiben!) vom ActionListener aufgerufen wird, ist auch nicht zu sehen

Das kleingeschriebene werde ich oben korrigieren, im Programm hat das natürlich einen aussagekräftigeren Namen.
Zu dem Display bzw. meineGUI sollte ich noch sagen, dass ich SWT verwende, also kein AWT oder Swing.
 
G

Gast2

Gast
Du lässt deine ganze Arbeite deinen GUI Thread machen, darum ist alles blockiert...
dass asyncron ist dafür da um was in deiner GUI zu machen... z.B. ein refresh oder eine progressbar zu aktualisieren...
 

j-look

Mitglied
Hm, der Thread läuft jetzt und die GUI ist nicht blockiert.
Jetzt ist nur noch die Frage: Wie bekomme ich Ausgaben, die im Thread erzeugt werden, in die GUI?
 
S

SlaterB

Gast
neues Runnable,
MeineGUI.getDisplay().asyncExec(r);
wie das anscheinend unter SWT heißt

und eigenen Thread gegebenfalls warten lassen, bis das fertig ist
 
S

SlaterB

Gast
gemeint ist doch offensichtlich der Aufruf von setVisible(true),
für den das anscheinend nicht gilt
 

hdi

Top Contributor
Nein nein, es geht hier nicht um setVisbile(true).

Eben weil Swing/AWT Komponenten auf dem EDT laufen (automatisch),
ist dieser Thread bei einem GUI Programm aktiv.

Wenn man nun noch einen anderen ziemlich aktiven Thread hat, kracht's.

Deshalb legt man gleich sein komplettes Programm auf den EDT. Für die GUI
macht das keinen Unterschied weil die eh dort landet, aber für den Rest der Programm-Logik
schon, weil die dann auch da drauf läuft.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
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
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


Oben