Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo
ich habe zwei thread, die auf eingaben aus der console warten.
Ich habe zwei instanzen der Klasse MyThread und möchte, dass eine Eingabe zweimal ausgegeben wird.
Code:
public class MyThread extends Thread {
public void run(){
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
try{
int zaehler = 0;
while(true){
System.out.println("Eingabe?: ");
String eingabe = in.readLine();
System.out.println("die Eingabe war:" + eingabe );
if(zaehler++ > 10) return;
}
}catch(IOException ioe){
ioe.printStackTrace();
System.exit(1);
}
}
}
Der code funktioniert mit mehreren Instanzen natürlich nicht aber beschreibt was ich vorhabe. Ist es möcglich, dass man irgenwie das implementiert?
die frage war nicht, ob das einen sinn macht sondern nur ob das möglich ist.
In der main methode starte ich mehrere threads, die bestimmte aufgaben übernehmen.
Aber diese threads möchte ich nach einer bestimmte Eingabe durch console beenden.
Dazu wird in main mehode, nach dem alle threads gestartet wurden, auf eine bestimmte eingabe gewartet.
Die anderen threads könnten auch irgendwann von user eine Eingabe erwarten.
Dann tritt das obengenante problem auf. Ich wollte nur fragen, wie damit umgangen werden kann.
dann solltest du ein Singleton bauen (z.B. ConsoleReader) mit welchem du über einen BufferedReader von System.in liest. Alle Threads dürfen nur darüber und nicht direkt lesen. Das lesen sicherst du mit synchronized ab. So kommt nur noch jeweils ein Thread von Tastatur einlesen.
public class ConsoleReader {
private static ConsoleReader consoleReader = null;
private BufferedReader in = null;
private ConsoleReader(){
in = new BufferedReader(new InputStreamReader(System.in));
}
public static ConsoleReader getConsoleReader(){
if(consoleReader == null){
consoleReader = new ConsoleReader();
}
return consoleReader;
}
public synchronized String getInput(){
String input = null;
try {
input = in.readLine();
} catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
return input;
}
}
dann kann eine Eingabe, wie du schon geschrieben hast, nur von einem Thread gelesen werden.
In diesem Fall sollte ich in main-Methode fortlaufend die Methode getInput() aufrufen. Auf jeden Fall
wird einer der beiden Thread eine Eingabe verpassen. Ich möchte aber beide Threads die Eingaben bekommen.
mach das Singleton zu einem Thread (od. Runnable), welcher dann exklusiv für die Eingabe zustädig ist. Dann definierst du ein Interface (z.B. ConsoleListener) mit einer Methode (z.B. processInputLine(String)). Jetzt müssen sich alle interessierten Threads über einen ConsoleListener beim ConsoleReader registrieren. Der ConsoleReader liest eine Zeile ein und ruft alle ConsoleListener auf, die dann die Eingabe auswerten können.