# Problem mit While Schleife 100% CPU LASt



## olli2000 (7. Juni 2005)

Hallo, habe folgendes Problem,

ich habe eine While Schleife, die heisst 

```
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


----------



## zerix (7. Juni 2005)

Macht die Schleife denn was, während sie auf eine Aktion "wartet"


----------



## Thomas Darimont (7. Juni 2005)

Hallo!


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

Gruß Tom


----------



## illaX (8. Juni 2005)

ich wuerde dafuer eher einen Thread benutzen


----------



## Levin Beicht (8. Juni 2005)

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.


----------



## schnuffie (8. Juni 2005)

Eleganter geht das per "wait-notify" ---> 


```
Collection col = new LinkedList();
 
KlasseA = new KlasseA(col);
KlasseB = new KlasseB(col);
```
 

```
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) {}
}
}
}
```
 

```
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...


----------



## Thomas Darimont (8. Juni 2005)

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


----------

