Hallo,
ich habe ein kleines Problemchen :roll: ...
Ich habe ein Programm das jede Menge Threads zur Berechnung eines Algorithmus startet. Diese werden mit minimaler Priorität gesartet. Die Gui ist auch ein Thread, den ich mit höchster Priorität starte. Es soll die aktuelle Anzahl der Algorithmus-Threads in einem Textfeld ausgegeben werden und die bereits verstrichene Zeit.
Damit das ganze funktioniert habe ich eine while schleife, die solange durchlaufen wird, wie Algo-Threads offen sind. Damit ich hier nicht die ganze Leistung verbrate schicke ich die Gui mit sleep(100) "schlafen". Mein Problem ist nun dass wenn viele Threads offen sind (so bei mehreren Hundert) die Gui für mehrere Sekunden nicht mehr aus dem "Schlaf" erwacht. Liegt das an Java oder was mache ich falsch?
Selstam ist, dass alles einige Zeit lang recht brav läuft, meist so die ersten 5-8 Sekunden, danach fängt der "hänge" Effekt an und dauert teilweise bis zu 20 Sekunden.
Thread gui = new Thread(new EvoGui());
gui.setPriority(Thread.MAX_PRIORITY);
gui.run();
Die GUI (nur die wohl interessanten Sachen)
Code:
public class EvoGui extends javax.swing.JFrame implements Runnable {
...
public EvoGui() { }
....
private void initComponents() {
panel1 = new java.awt.Panel();
GeneVon = new java.awt.TextField();
GeneBis = new java.awt.TextField();
.... }
private void button1ActionPerformed(java.awt.event.ActionEvent evt) {
int i, j;
Thread v = Thread.currentThread();
v.setPriority(Thread.MAX_PRIORITY);
Date d = new Date();
long start = d.getTime();
.....
//Aufruf der Algo-Threads
Thread[] t = new Thread[ta.length];
//calculate all population-combinations in own threads
for (int k=0;k<ta.length;k++) {
t[k] = new Thread(new EvoPopulation(ta[k].Anzahl, ta[k].gene,
pa.generationen, pa.mutate, pa.recombine, pa.rand , pa.bestFitness));
t[k].setPriority(Thread.MIN_PRIORITY);
t[k].start();
}
//wait for all population-threads to finish
while(Thread.activeCount() > 6) {
testFeld.setText(String.valueOf(Thread.activeCount() - 6));
d = new Date();
testZeit.setText(String.valueOf((d.getTime()-start)/1000));
this.repaint();
//Hier Sleep - Das PROBLEM!
//bei vielen Algo-Threads (>1000) kommt der sleep teilweise sekundenlang nicht zurück
try { v.sleep(100); }
catch (java.lang.InterruptedException ex) { System.err.println(ex); }
}