System.in.read blockt alle Threads?!

mccae

Senfdazugeber
Huhu,

Ich hab da ein merkwürdiges Problem,...

Wenn ich System.in.read() benutze, blockt dies ALLE Threads....

Hier mal ein Beispiel:

Java:
package ****.javamysterien.M122;

import java.io.IOException;
   
    /**
     * Java Mysterium, Katalognummer 122<p>
     *
     * Diese Javamysterium gehört in die Kategorie Threading<p>
     *
     * Es simuliert die seltsamen Eigenschaften von System.in.read<p>
     *
     * <i>Status: Ungeloest</i>
     *
     * @author mccae
     */
    public class Mysterium122
    {
        public static void main (String [] args){
            //Debug.OutUmleiten(Debug.MYSQLO,122,new MYSQLManager("localhost","root",""));
            //Debug.ErrUmleiten(Debug.MYSQLE,122,new MYSQLManager("localhost","root",""));
           
            //#122 %)
            System.out.print("Filips Java-mysterium #122");
           
            //Erstelle Runnable und Thread objekt
            Mysterium122Runnable run = new Mysterium122Runnable();
            Thread t = new Thread(run);
           
            //Starte thread
            t.start();
           
            //System.in und warten
            try {
                System.in.read();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
           
            //Thread freundlich bitten zu sterben
            run.quit = true;
           
            //Auf den Kollegen warten
            while(!run.isFinished()){
                try {
                    Thread.sleep(100L);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
      }
    }

Hier wird der gleich folgende Thread gestartet, und nach System.in.read zum stoppen aufgefordert,...

Java:
package ***.javamysterien.M122;

public class Mysterium122Runnable implements Runnable {
   
    public volatile boolean quit = false;
   
    private volatile boolean finished = false;
    @Override
    public void run() {
        while(quit){
            try {
                Thread.sleep(500L);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("Tick-tock");
        }
        finished = true;
    }
   
    public boolean isFinished() {
        return finished;
    }
}

Das ganze arbeitet nicht wie erwartet,....

Meiner Meinung nach sollte der Ouput so aussehen:

Code:
Filips Java-mysterium #122
Tick-tock
Tick-tock
.
.
.

Tick-tock

Er sieht aber so aus:

Code:
Filips Java-mysterium #122

Es wird verhindert, dass der Thread in die run methode einsteigt.
Sobald ich irgendwas in die konsole tippe, und System.in.read returnt, beendet sich der Thread sofort (logisch).

Irgendwie machts nicht klick,....
Warum blockt nur diese Methode meinen anderen Thread?

Liebe Grüße,
 
Zuletzt bearbeitet:
Hallo,

ich würde mal sagen, dass es daran liegt, dass die Console auf eine Eingabe wartet und zur gleichen Zeit nichts auf der Console ausgegeben werden kann. Genauso wenig funktioniert es gleichzeitig aus einer Datei zu lesen und zu schreiben.

Ist jetzt nur mal eine Behauptung. :-)

Gruß

Sascha
 
Hallo,

ich würde mal sagen, dass es daran liegt, dass die Console auf eine Eingabe wartet und zur gleichen Zeit nichts auf der Console ausgegeben werden kann. Genauso wenig funktioniert es gleichzeitig aus einer Datei zu lesen und zu schreiben.

Ist jetzt nur mal eine Behauptung. :)

Gruß

Sascha

Neee,

Wenn ich mim Debugger durchrushe, bleibt der Pointer genau bei run(){ stehen.
Er kommt net mal in die run() rein -___-

@THMD:
Das mit der Bedingung stimmt schon so: "So lange quit false ist, führe den Code aus"
Nach System.in wird quit auf true gesetzt und bewusst aus der Schleife ausgebrochen

mfg
Martin Conrad Caeasar
 
Zuletzt bearbeitet:
@THMD:
Das mit der Bedingung stimmt schon so: "So lange quit false ist, führe den Code aus"
Nach System.in wird quit auf true gesetzt und bewusst aus der Schleife ausgebrochen

Dein Gedankengang ist ja richtig, aber dadurch wird die Bedingung nicht true. Eine Schleife läuft so lange wie ihre Bedinung true ist und das ist bei dir nicht der Fall.
Es müsste schon so heißen
Code:
while(!quit)


Gruß

Sascha
 
Dein Gedankengang ist ja richtig, aber dadurch wird die Bedingung nicht true. Eine Schleife läuft so lange wie ihre Bedinung true ist und das ist bei dir nicht der Fall.
Es müsste schon so heißen
Code:
while(!quit)


Gruß

Sascha

Verdammt!

Und ich wollte das dem armen System.in in die Schuhe schieben...

Das mit while(true) hab ich in diesem Fall total vergessen,...
Ich habs bis jetzt immer richtig gemacht, nur nicht hier -___-

Ich hätt nicht gedacht, dass es so einfach ist xD.

Das hat sich erledigt, danke.
 
Zurück