Problem mit While Schleife 100% CPU LASt

olli2000

Grünschnabel
Hallo, habe folgendes Problem,

ich habe eine While Schleife, die heisst
PHP:
while(true) {
//mache was
}

Die tut auch was sie soll, nur gibt es das Problem, das sie 100 % der Rechenzeit in anspruch nimmt. Diese Schleife muss laufen, da es auf Ereignisse von aussen reagiert. Man könnte die natürlich mit sleep ein wenig drosseln.
Ich habe gedacht, kann man die nicht so ummodeln, dass die while Schleife nur noch 5% der CPU in Anspruch nimmt? Aber wie würde das gehen?

Gruss

olli2000
 
Hallo!

Code:
while(true){
   //....
   try{
       Thread.sleep(100L);
   }catch(InterruptedException ie){
      ie.printStackTrace();
   }
}

Gruß Tom
 
Mach am besten einen eigenen Thread in dem diese Schleife läuft.
Das würde zwar immer noch 100% der CPU verbrauchen, aber du könntest währenddessen noch was anderes machen. Wenn es immer noch zu viele Ressourcen frisst kannst du entweder die Priorität des Threads runterstellen, oder wie Tom schon vorgeschlagen hat, diesen Thread einfach mal ein paar ms schlafen legen.
 
Eleganter geht das per "wait-notify" --->

Code:
Collection col = new LinkedList();
 
KlasseA = new KlasseA(col);
KlasseB = new KlasseB(col);

Code:
public class KlasseA implements Runnable {
 
private Collection col;
 
public KlasseA(Collection col) {
this.col = col;
Thread t = new Thread(this);
t.start();
}
 
public void run() {
synchronized(col) {
try {
while (true) {
col.add(new Long(System.currentTimeMillis()));
col.notify();
Thread.sleep(100);
}
catch (InterruptedException ie) {}
}
}
}

Code:
public class KlasseB implements Runnable {
 
private Collection col;
 
public KlasseB(Collection col) {
this.col = col;
Thread t = new Thread(this);
t.start();
}
 
public void run() {
synchronized(col) {
try {
while (true) {
if (col.empty()) col.wait();
System.out.println(col.remove(0));
}
catch (InterruptedException ie) {}
}
}
}

Es wird also nur Prozessor-Leistung verwendet, wenn auch was getan wird... :-)
 
Hallo!

Na ja, ob das so elegant ist wage ich zu bezweifeln ...normalerweise tut man guter Dinge, wenn man diese low level Synchronisierung weitestgehend vermeidet...
Dazu gibts unter Java 5 das neue Concurrent Package welches zahlreiche nützliche Klassen für die nebenläufige Programmierung enthält.


...
Sollte man in einer Swing Application beispielsweise nach einem Button Klick eine lang laufende Aktion starten sollte man dies in einem eigenen Thread tun. Um nun von diesem Thread aus Veränderungen an der GUI durchzuführen (Z.Bsp. updaten eines Statusbalkens) bietet die Klasse SwingUtilities die beiden Methoden invokeLater(Runnable r) bzw. invokeAndWait(....).

Gruß Tom
 
Zurück