Threads Jede Klasse einem Thread zuweisen

mirisbowring

Bekanntes Mitglied
Guten Tag,

ich habe ein Programm geschrieben, welches recht umfangreich und vor allem Lang ist, was eine lange Startzeit mit sich bringt.

Mein Programm besteht aus einem Frame, in das je nach Bedarf (Button druck), ein anderes Panel geladen wird. Ich habe nun recht viele Panel, und wenn ich die am Anfang alle Aufrufe, dann benötigt das Programm ganz 1:30 min, um zu starten (da er erst die Klassen lädt und dann das Frame sichtbar macht). Das doofe daran ist, dass während dieser Zeit kein Feedback kommt. Und wenn man nicht weiß, dass das Programm so lange zum starten braucht, denkt man, es startet nicht.

Ich habe bereits Versucht, die Klassen erst auf Buttondruck zu laden (so braucht das Programm nur 10 sec. zum starten), allerdings passiert dann im Programm nichts, bis das Panel fertig geladen ist (was bei 20k Zeilen Code schon eine Weile dauert).

Aus diesem Grund dachte ich mir, dass jedes Panel einem Thread zugeordnet wird. Und bei Programmstart parallel gestartet wird.
Da habe ich nun die Frage, wie ich auf Buttondruck das Panel aus dem Thread sichtbar mache.

Um einen Thread zu erstellen benutzt man ja standart mäßig:

Java:
Thread BeiMirPanel1 = new Thread(Panel1());
BeiMirPanel1.start();

Ist mein Denkansatz richtig? Bzw. gibt es bessere Vorschläge?
Falls der Ansatz richtig sein sollte, wie rufe ich das Panel aus dem Thread auf? (so als würde ich normal eine Klasse instanziieren?)

MfG

mirisbowring
 

stg

Top Contributor
Viele Threads sind kein Allheilmittel. Der normale Endanwender wird in der Regel auch nur 2 oder 4 Rechenkerne zur Verfügung haben, da wird sich der Vorteil also in Grenzen halten. Das eigentliche Problem ist vermutlich schlicht in deinem Code zu suchen. In 1:30min kann man auf heutigen Maschinen so immens viel berechnen usw, da solltest du dich wirklich fragen, ob da alles so optimal abläuft... 20k Codezeilen sind auch nicht per se so viel.
Unabhängig davon kann es durchaus sinnvoll sein das Laden der benötigten Ressourcen in einen zweiten Thread auszulagern und im ersten die GUI aufzubauen und den User über den Ladefortschriit zu informieren.
 

Tobse

Top Contributor
Soweit ich weiß, sind die Threads in Java doch unabhängig von der Prozessoren oder?
Völlig korrekt. Nehmen wir folgendes an: Der Prozessor hat 4 Kerne. Wenn 3 Threads laufen, muss das OS den Code aus drei Threads auf 4 Kerne verteilen, was extra Rechenaufwand ist. Oder es lässt den 4. Kern einfach im Ruhezustand, somit ist 1/4 der Rechenkraft nicht genutzt.
Bei mehr als 4 Threads muss das OS den Code von vielen Threads immer abwechselnd pausieren, damit die 4 Kerne z.B. 13 Threads gleichzeitig bearbeiten können => wieder mehr Rechenaufwand.
Der Logische schluss: Jedes Programm läuft dann am performantesten, wenn es genau so viele Threads hat, wie der Prozessor Kerne hat.
Die Gründe, warum man trotzdem deutlich mehr Threads hat, sind Sturktur und die Tatsache, dass ein Thread einen Kern meistens nicht auslastet.
In deinem Fall aber ist genau das der Fall: Du lastest die CPU (oder die Festplatte?) komplett aus. Andernfalls wäre die Startzeit nicht bei 1:30.

Um auf diene Ursprüngliche Frage zurückzukommen: Ich kann stg nur beipflichten. In 1:30 kannst du selbst auf einem Handy sehhhr viel berechnen; keine GUI, die anstädnig geschrieben ist, braucht so lange. Zum Vergleich: Große Java-Programme (NetBeans, IntelliJ, OpenOffice) brauchen auf meinem Lahmarschigen Laptop (2x1,35Ghz) keine 30 Sekunden zum starten.
Wenn du 20.000 Zeilen in einer Klasse hast (vermute ich jetzt mal, weil du von Panels sprichst), liegt dort vielleicht das Problem. 20.000 Zielen so in eine Klasse zu packen, dass sie effizient arbeiten, ist imho unmöglich.
 

Dompteur

Top Contributor
Auf welchem Framework basiert deine GUI ? Davon hängt es ab, ob du mehrere GUI Threads überhaupt verwenden kannst.
Dein Framework kann also schon deinen Plan, Bildschirmbereiche parallel aufzubauen, verhindern.
Was aber immer geht, ist Tasks zu definieren, die einzelne Bildschirmbereiche mit Daten versorgen. Die Berechnung/Ermittlung der Daten könnte also parallel erfolgen.
Das sind nun sehr allgemeine Aussagen. Um konkreter zu werden, müsste man mehr über dein Programm wissen.

Hast du schon analysiert, wo deine Anwendung die Zeit verbraucht ?
Wenn du die Langläufer identifiziert hast, lohnt es sich zu schauen, ob das nicht optimierbar ist.

Grundsätzlich kann die Aufteilung einer Anwendung in Threads meist einen deutlichen Geschwindigkeitsgewinn. Dabei stimme ich meinen Vorpostern nicht zu, dass es keinen Sinn machte, mehr Threads als Kerne zu haben. Ein Programm besteht nämlich nicht nur aus Rechenoperationen, sondern beispielsweise auch aus I/O-Operationen. Während also ein Thread Daten liest, kann ein anderen Thread die CPU voll nutzen.

Man darf aber nicht vergessen, dass Threads zusätzliche Komplexität in die Anwendung bringen.
 

mirisbowring

Bekanntes Mitglied
Also von den 20k Zeilen ist etwa 1/3 bis 1/2 auto generiert (für dieses Panel habe ich den Netbeans GUI Builder verwendet, da mein Informatik Lehrer meinte, das mir das Ding arbeit erspart)
Er hatte zum einen Teil recht, zum anderen aber bekomme ich das, was der Builder schreibt meistens in weniger Zeilen.

Ich habe zur Zeit 14 Panel.
Wenn ich nun den Weg nehme, und die Panel erst auf Buttondruck lade, benötigt das 20k panel logischerweise am längsten. Das Laden dauert da etwa 12-15 Sekunden. Ich habe noch 2 andere Panel, die etwa 9-10 sekunden brauchen. Der Rest bewegt sich im akzeptablen Bereich.

Was Ich noch dazu sagen muss ist, das die Klassen auf eine Datenbank (JavaDB bzw. Derby) zugreifen.
 

Dompteur

Top Contributor
Ich würde als nächstes ausmessen, wie lange die Zugriffe auf die Datenbank benötigen.
Dann weißt du, ob der GUI-Aufbau oder das Daten holen, für die lange Startphase schuld sind.
Wenn es an den Zugriffen auf die Datenbank liegt, kannst du dir auch noch die SQLs anschauen. Eventuell kannst du da noch etwas verbessern (Indizes, ..).

Erst, wenn das nicht ausreicht, würde ich das Programm umstrukturieren und die Datenzugriffe parallel machen.
 

Tom299

Bekanntes Mitglied
Ich würde mir auch zuerst mal die Datenbank-Zugriffe ansehen. Selbst wenn du über for-Schleifen eine GUI dynamisch aufbaust (wie auch immer das aussehen würde), brauchste bestimmt keine 1:30min dafür.

Wenn du MySQL verwendest kannst du die MySQL Workbench benutzen, um Abfragen abzuschicken und siehst dann gleich die Abfragezeit/Antwortzeit. Und da wird dein Problem vermutlich liegen.

Falls alle Stricke reißen machst du einfach in der Mitte des Bildschirms ein Fenster mit Ladebalken oder sonst was, damit der Benutzer sieht, daß das Programm etwas tut (z.B. wenn man Gimp startet usw.) und blendest das erst aus, wenn die GUI fertig geladen ist.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Braucht jede Klasse eine Schnittstelle ? Java Basics - Anfänger-Themen 4
berserkerdq2 Spiel hängt sich immer in der 4 Runde auf, obwohl ich jede Runde das gleiche mache Java Basics - Anfänger-Themen 1
D Ampel Programmieren die jede 10 sekunden ihre farbe wechselt Java Basics - Anfänger-Themen 6
B Methode für jede beliebe Entity erstellen Java Basics - Anfänger-Themen 7
L Jede zweite Ziffer entfernen (rekursiv) Java Basics - Anfänger-Themen 6
A Jede x-te Zeile, lösche 10 Zeilen Java Basics - Anfänger-Themen 9
S Jede Ziffer einer Zahl auslesen, damit rechnen und beim Ergebnis wiederholen ? Java Basics - Anfänger-Themen 20
M Primzahlen, nur jede 2te ausgeben Java Basics - Anfänger-Themen 11
V Ein Wort einlesen und dann jede Buchstabe ausgeben Java Basics - Anfänger-Themen 10
K Mit Scanner aus einer txt Datei lesen und jede Person mit name, vorname, geburtsdatum speichern Java Basics - Anfänger-Themen 5
U Farbe meines Würfels jede sekunde ändern! Java Basics - Anfänger-Themen 5
W Erste Schritte Timer soll jede Sekunde Label aktualisieren Java Basics - Anfänger-Themen 5
R JLabel imageicon jede Sekunde wechseln Java Basics - Anfänger-Themen 3
S Jede Reihenfolge einer zufällig langen Liste ausprobieren Java Basics - Anfänger-Themen 3
J Eine int Variable jede Sekunde um 1 hocnzählen Java Basics - Anfänger-Themen 3
T Zufalls jedoch jede nur einmal Java Basics - Anfänger-Themen 10
K Swing Fenster jede sec.neuzeichnen Java Basics - Anfänger-Themen 14
A InputStream gibt nur jede 2te Zeile aus Java Basics - Anfänger-Themen 7
J Ein Wort einlesen und dann jede Buchstabe ausgeben Java Basics - Anfänger-Themen 25
J Jede Zeile der Textdatei in ListUI eintragen Java Basics - Anfänger-Themen 2
N jede Zwanzigste... ? Java Basics - Anfänger-Themen 12
E Jede Objektart in Mutterelement erlauben? Java Basics - Anfänger-Themen 3
E Klassendesign: Array für jede Objektart?! Java Basics - Anfänger-Themen 6
Developer_X jede Zeile einer Datei mit einem String verketten Java Basics - Anfänger-Themen 16
S PrepareStatement, jede neue Zeile INT-Wert Java Basics - Anfänger-Themen 5
W Die Methode print() wird 2 mal für jede Seite aufgerufen Java Basics - Anfänger-Themen 9
G jede 2te zeile in vector leer einfügen, wie? Java Basics - Anfänger-Themen 4
N Aus Textdatei jede Zeile in einen String lesen Java Basics - Anfänger-Themen 22
F 2DArray jede Spalte Addieren Java Basics - Anfänger-Themen 8
G Datum und Text in jede beliebige Anwendung einfügen Java Basics - Anfänger-Themen 3
U Jede Sekunde Java Basics - Anfänger-Themen 6
M Jede Variable als private, protected etc. deklarieren? Java Basics - Anfänger-Themen 7
I @Inject in normaler Klasse? Java Basics - Anfänger-Themen 4
P Enum oder normale Klasse? Java Basics - Anfänger-Themen 10
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
P Wie kann ich meine Keylistener Klasse unterscheiden lassen, von welcher "Quelle" der Input kommt? Java Basics - Anfänger-Themen 2
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
Amina556 Eigene Klasse definieren Java Basics - Anfänger-Themen 9
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
M Klasse in Runden Klammern bei Objektimplementierung Java Basics - Anfänger-Themen 4
J Klassen Klasse als Komponententyp bei Feldern Java Basics - Anfänger-Themen 2
J Klassen Instanzen einer Klasse in einer anderen unabhängigen Klasse nutzen Java Basics - Anfänger-Themen 4
Detlef Bosau nichtstatische Innere Klasse, this Pointer. Java Basics - Anfänger-Themen 47
C Unbekannte Methode add bei Klasse die JTree erweitert Java Basics - Anfänger-Themen 14
Soranix Erste Schritte Struktur als Anfänger // Von einer Klasse auf ein Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 6
J Zugriff auf eine 2. Klasse die per UI-Designer erstellt wurde Java Basics - Anfänger-Themen 1
B Wie kann ich folgende Klasse/Methode per Button ausführen? Java Basics - Anfänger-Themen 1
B Klasse statisch erstellen da n-mal geladen Java Basics - Anfänger-Themen 3
T Meine Klasse wird nicht gefunden Java Basics - Anfänger-Themen 1
XWing Random Punkte erstellen mit der Random klasse Java Basics - Anfänger-Themen 15
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
frager2345 Optional Klasse Java Java Basics - Anfänger-Themen 2
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
H Klassen Typ und Intitialisierungs-Klasse, wer bestimmt was? Java Basics - Anfänger-Themen 1
P Array vom Typ Klasse Java Basics - Anfänger-Themen 18
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
frager2345 Java Klasse Buch verwalten Java Basics - Anfänger-Themen 0
frager2345 Java eigen Klasse zum verwalten von Büchern Java Basics - Anfänger-Themen 3
T Zugriff auf Control anderer Klasse Java Basics - Anfänger-Themen 5
H Compiler-Fehler Klasse in einem Package wird nicht gefunden bzw. akzeptiert Java Basics - Anfänger-Themen 12
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
G zwei Instanzen einer Klasse Java Basics - Anfänger-Themen 29
C Int an andere Klasse übergeben Java Basics - Anfänger-Themen 26
sserio Wie kann man nach einer Klasse fragen? Java Basics - Anfänger-Themen 12
B Klasse "Character" Java Basics - Anfänger-Themen 2
F Suche nach betreuender Person für eine Jahresarbeit der 12. Klasse. Java Basics - Anfänger-Themen 6
H Mit setter-Methode JLabel in einer andern Klasse ändern. Java Basics - Anfänger-Themen 40
U Warum kann ich, auf private Variablen zugreifen, wenn ich ein Objekt in der Klasse, die private Variablen hat erstelle und dort drauf zugreifen will? Java Basics - Anfänger-Themen 7
U Warum kann ich die Methode in der ENUM Klasse nicht aufrufen? Und warum geht die Switch nicht? Java Basics - Anfänger-Themen 8
D Array in Main Methode aus anderer Klasse aufrufen Java Basics - Anfänger-Themen 3
I Array Länge in Klasse festlegen Java Basics - Anfänger-Themen 1
L Klassen Vektor Klasse Java Basics - Anfänger-Themen 2
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
Igig1 Welche Werte sind als default Werte in einem Array, der als Datentyp eine Klasse hat? Java Basics - Anfänger-Themen 1
X Was ist der Unterschied zwischen materialisierten und nichtmaterialisierten Attributen einer Klasse? Java Basics - Anfänger-Themen 1
W Klasse existiert prüfen Java Basics - Anfänger-Themen 5
U Wie ein Attribut von einer Klassenmethode in der Klasse speichern= Java Basics - Anfänger-Themen 2
O Wie erstelle ich eine Instanz in einer Klasse für die ich die Instanz will? Java Basics - Anfänger-Themen 4
W Verschiedene Methoden in einer Klasse in der Main aufrufen? Java Basics - Anfänger-Themen 8
M Eclipse kennt keine String Klasse mehr Java Basics - Anfänger-Themen 1
M Frage zur Methode split der Klasse String Java Basics - Anfänger-Themen 32
J Fehler bei array aus anderer Klasse Java Basics - Anfänger-Themen 3
D Einen boolischen Wert aus einer Methode in einer anderen Klasse aufrufen? Java Basics - Anfänger-Themen 11
W n verschiedene Arrays zufällig ausgeben - mit der Random-Klasse? Java Basics - Anfänger-Themen 8
R TreeSet Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 8
C Auf die Methode einer anderen Klasse zugreifen Java Basics - Anfänger-Themen 1
B Static Attribute in einer Klasse, wie geht das? :O Java Basics - Anfänger-Themen 19
M Von einem Menü Methode aus anderer Klasse ausführen, die errechnete Werte in Datei schreibt. Java Basics - Anfänger-Themen 8
KogoroMori21 Objektvariable anderer Klasse übernehmen, Getter/Setter Java Basics - Anfänger-Themen 11
Vivien Auf eine Variable von einer anderen Klasse aus zugreifen Java Basics - Anfänger-Themen 3
M Aufruf von statischen Methoden einer anderen Klasse Java Basics - Anfänger-Themen 15
tony241188 Implementieren Sie die Klasse Hersteller, welche die folgenden Elektrogeräte produziert Java Basics - Anfänger-Themen 3
J Junit4 Klasse erstellen Java Basics - Anfänger-Themen 5
T Auf Instanz der selben Klasse aus überschriebener Methode in Methode zugreifen. Java Basics - Anfänger-Themen 2
M Scanner Klasse Java Basics - Anfänger-Themen 4
L Meine erste eigene Exception Klasse Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben