Thread Problem

Hallo,

ich habe ein Problem mit parallel laufenden Threads.

Mein Vorhaben:
Per Eingabe soll der Befehl 'start' und 'stop' entgegen genommen werden.
Wenn start eingegeben wird, soll jede Sekunde die Meldung ''hello" ausgegeben werden. Bei Stop soll die Ausgabe angehalten werden.

Zusätzlich soll die gesamte Anwendung in einem Thread laufen und nicht beendet werden.

Daher habe ich versucht, mein Vorhaben anhand von drei Threads zu realisieren.

Würde mich freuen, wenn mir jemand weiter helfen könnte.

Gruß
Angelika

PHP:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ThreadTest implements Runnable {

    static boolean isRunning = true;
    
    public void run() {
        while (true) {
            
        }
    }

    public synchronized static void sayHello() {
        System.out.println("------------ sayHello()");
        while (isRunning) {
            System.out.println("hello");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {

            }
        }
    }
    
    public static void main(String args[]) {        
        
        Thread inputThread = new Thread() {
            public void run() {
                try {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
                     while(true) {
                    	 System.out.println("input");
                        if ("stop".equals(reader.readLine())) {
                            // Wenn 'start' eingegeben wird, soll sayHello gerstartet werden.
                            // Bei Eingabe von 'stop' soll die Methode angehalten werden.
                            System.out.println("------------ stop");
                            isRunning = false;
                        }
                        if("start".equals(reader.readLine())) {
                            System.out.println("------------ start");
                            isRunning = true;
                            sayHello();
                        }
                    }
                } catch (IOException ex) {}
            }
        };
        
        final ThreadTest test = new ThreadTest();
        Thread thread = new Thread(test);
        thread.start();
        System.out.println("------------ run()");
        
        inputThread.start();
        System.out.println("------------ inputThread");
        
        Thread sayHelloThread = new Thread() {
            public void run() {
                test.sayHello();
            }
        };	
        sayHelloThread.start();
        
        System.out.println("------------ sayHelloThread");        
    }
    
}
 
Zuletzt bearbeitet:
Guten TagTag,

Quick & Dirty:

Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class TheadIT {

	private static Thread thRun;
	private static boolean stopped = true;

	public static void main(String[] args) {

		Thread thInput = new Thread() {

			public void run() {
				System.out.println("Input läuft");
				while (true) {
					BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
					String line = "";
					try {
						line = reader.readLine();
						System.out.println("Input: " + line);
						if (line.equals("start")) {
							stopped = false;
							startRunThread();

						} else if (line.equals("stop")) {
							stopped = true;
						}

					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		};

		thInput.start();

	}

	private static void startRunThread() {
		thRun = new Thread() {

			public void run() {

				while (stopped == false) {
					System.out.println("Ich Laufe");
					try {
						this.sleep(2000);
					} catch (InterruptedException e) {
						e.printStackTrace();
						interrupt();
					}
				}
				interrupt();
			}
		};
		
		thRun.start();
	}
}

gehe ähnlich vor wie du, nur das ich meinen Thread beim stoppen töte und beim start wieder neu eröffnet (spart meiner Ansicht nach auch SystemRessourcen, da der AusgabeThread ja im gestoppten Zustand ohnehin nur feststellt das er nicht sagen darf)

Allerdings funktioniert mein Code auch, wenn ich das ganze auf deine Logik umbaue und den Run-Thread am leben lasse und ich die Ausgabe (genau wie du) nur über den boolean-Wert steuere, den Ausgabe-Thread aber weiterlaufen lasse... werde noch mal durch deinen Code gehen und schauen was ich da genau anders gemacht habe.

Hoffe aber erst mal geholfen zu haben
D
 
Zuletzt bearbeitet:
Und noch mal exakt mit deinem Code. Änderungen habe ich mit **** Kommentiert.
Das syncroniesieren brauchtst du bei den Methoden auch eigentlich nicht (das verwendest du wenn mehrer Threads dieselben Variablen z.B. schreiben)

Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ThreadTest { // ****** "Haupt-Thread entfernt, nicht nötig?

	static boolean isRunning = true;

	public synchronized static void sayHello() {
		System.out.println("------------ sayHello()");
		while (true) {   // **** Endlosschleife für den Thread

			while (isRunning) {
				System.out.println("hello");
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {

				}
			}
		}
	}

	public static void main(String args[]) {

		Thread inputThread = new Thread() {
			public void run() {
				try {
					BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
					while (true) {
						System.out.println("input");
						if ("stop".equals(reader.readLine())) {
							// Wenn 'start' eingegeben wird, soll sayHello
							// gerstartet werden.
							// Bei Eingabe von 'stop' soll die Methode
							// angehalten werden.
							System.out.println("------------ stop");
							isRunning = false;
						}
						if ("start".equals(reader.readLine())) {
							System.out.println("------------ start");
							isRunning = true;
							//sayHello(); *** Raus da er die ganze Zeit läuft.
						}
					}
				} catch (IOException ex) {
				}
			}
		};

// ************** HauptThread entfernt
//		final ThreadTest test = new ThreadTest(); 
//		Thread thread = new Thread(test);
//		thread.start();
//		System.out.println("------------ run()");

		inputThread.start();
		System.out.println("------------ inputThread");

		Thread sayHelloThread = new Thread() {
			public void run() {
				ThreadTest.sayHello();
			}
		};
		sayHelloThread.start();

		System.out.println("------------ sayHelloThread");
	}

}

Leider kann ich Dir nicht genau sagen warum deins nicht ging...bin mehr der Praktiker :D nur so viel, du startest deinen Ausgabe Thread, ganz unten und rufst die sayHello() Methode auf. Sobald du "Stop" eingibst. Ended deine Schleife, und der Thread ist zu ende.Wenn man dann wieder "start" eingibt, ruft der wieder die sayHello() Methode auf, und da setzt es bei mir aus, an der Stelle bist du NICHT mehr in dem SayHelloThread, da läuft die Schleife in einem "Ober"-Thread oder so? Auf jeden fall scheint dadurch die Eingabe nicht mehr durch zu kommen, die Variable wird nicht auf "false" gesetzt und er rennt immer munter weiter.

Vielleicht kann dazu noch ein Thread-Experte was sagen :)

grüße
Dom
 
Zurück