# Was macht Thread, wenn er aus einem "leeren" Inputstream liest ?



## Mondlichtung (10. Jan 2012)

Hallo 

Die folgende Frage kam mir währes des Lesens des Chat Beispiels unter
http://www.java-forum.org/netzwerkprogrammierung/5507-netzwerkgrundlagen-serversocket-socket.html
auf.

Dort heißt es unter anderem:

```
class ClientBody extends Thread {
   private InputStream i;
   public ClientBody(InputStream i) {
      this.i=i;
   }
 
   public void run() {
      String buffer;
      BufferedReader in;
      int n;
      try {
         in = new BufferedReader(new InputStreamReader(i));
         while ((buffer = in.readLine()) != null) {            
            if ((n = buffer.indexOf("users|", 0)) > -1) {
               buffer = buffer.substring(n + "users|".length(), buffer.length());
               buffer = buffer.replace('|', ',');
               System.out.println("\n\n==>Angemeldete User: " + buffer);            
            } else
               System.out.println("\n\n==>Eingang von " + buffer);
            System.out.print("\nText eingeben -> <zielrechner> <message># ");      
         }
         
      } catch (Exception e) {}   
   }
}
```
Soweit ich das Beispiel verstanden habe, wird der ClientBody dazu benutzt einen Thread im Hintergrund des Clients laufen zu lassen, der Nachrichten vom Server (z.B. wenn jemand anderes etwas schreibt) empfängt. Dabei wird obige while Schleife solange gelesen, bis nichts mehr aus dem InputStream gelesen werden kann, d.h. null wird zurückgeliefert. 

Frage:
Wird null nicht sofort erreicht, sobald keiner etwas schreibt ?
Falls nein, was passiert dann ? Der Thread wird schlafen gelegt, bis der InputStream etwas hergibt ?

Dankeschön, Mondlichtung


----------



## Schandro (10. Jan 2012)

Probiers doch einfach aus


----------



## Tomate_Salat (10. Jan 2012)

null wird zurückgegeben, wenn der inputstream in der read-Methode [c]-1[/c] zurückgibt (Stream ist zuende). Ansonsten wird gewartet bis ein "Zeilenumbruch" gesendet wird. Danach wird der String in der readLine() zurückgegeben.


----------



## Mondlichtung (10. Jan 2012)

Danke soweit für die Antworten.

Ich habe das von mir erwähnte Beispiel ausprobiert und es funktioniert auch sehr gut.
Der Thread ClientBody, der im Hintergrund des Clients läuft und auf Nachrichten wartet, beendet sich nicht vorzeitig. D.h. die readLine Methode "wartet" auf neue Daten. Ich nehme an, der Thread wird solange schlafen gelegt (um Ressourcen zu sparen) ?

Desweiteren würde mich interessieren, warum er gerade bei dieser Methode wartet ?
In der Java API unter readLine() konnte ich leider keine weiteren Informationen dazu finden.
Vielleicht kann mir jemand einen Link empfehlen, wo ich das genauer nachlesen kann?

Schöne Grüße, Mondlichtung


----------



## Tomate_Salat (10. Jan 2012)

Siehe hier: [japi]InputStream#read()[/japi]


----------



## Mondlichtung (10. Jan 2012)

Tomate_Salat hat gesagt.:


> Siehe hier: [japi]InputStream#read()[/japi]



Klasse, danke.

Auch interessant ist dann die Frage, wie wird blockiert? Wird der Thread in den sleep Status versetzt oder verbraucht er durch ständiges Abfragen Ressourcen?

Unter
networking - Java BufferedReader readline blocking? - Stack Overflow
hat jemand dies unter Linux getestet mit dem Ergebnis, dass der Thread im Sleep Status ist.

Falls jemand hierzu genaueres weiß oder die Aussage aus dem Link bestätigen kann, das würde mich interessieren.

Schöne Grüße, Mondlichtung


----------

