Java Anwendung in Konsole zur Laufzeit stoppen?

Schau mal hier
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ConsoleAbortExample {

	public static void main(String[] args) {
		ExecutorService executorService = Executors.newSingleThreadExecutor();
		Counter c = new Counter();

		executorService.execute(c);

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		String line = null;
		try {
			line = br.readLine();
		} catch (IOException e) {
			e.printStackTrace();
		}

		if (line.equalsIgnoreCase("exit")) {
			c.setStop(true);
			System.out.println(c.getCount());
		}

	}

	private static class Counter implements Runnable {

		private int counter = 0;

		private boolean stop = false;

		public void count() {
			while (!isStop()) {
				counter++;

				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}

		public boolean isStop() {
			return stop;
		}

		public void setStop(boolean stop) {
			this.stop = stop;
		}

		public void run() {

			System.out.println("Start counter");
			count();
			System.out.println("Counter finished");

		}

		public int getCount() {
			return counter;
		}

	}
}

Sowas funktioniert allerdings nur, wenn nichts auf der Konsole ausgegeben werden soll.


MFG

zEriX
 
Würde es derart nicht mehr Sinn machen? Dann kann auch gerne etwas auf der Konsole ausgegeben werden
Code:
public class Main {
    
    /** Creates a new instance of Main */
    public Main() {
        new Listener().start();
        doSomething();
    }
    public void doSomething(){
        while(true){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            System.out.println("hallo");
        }
    }
    public static class Listener extends Thread{
        boolean notStop = true;
        public void run(){
            while(notStop){
                try {
                    Thread.sleep(1000);
                    int c=0;
                    c = System.in.read();
                    System.out.println(c);
                    if(c==120)//x
                        notStop = false;
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                
                
            }
            System.exit(0);
        }
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new Main();
    }

Aber alle Konstruktionen die mir möglich erscheinen haben halt den Nachteil, dass sie nur reagieren, wenn man auch die "Enter" Taste drückt. Einfache Tastenanschläge zu registrieren ist Imho nur nativ um JNI möglich..

*grüssle*
MeinerEiner
 
Hi

vielen Dank für Eure Bemühungen!

Ich habe das Script von MeinerEiner_80 mal ausprobiert, doch irgendwie bricht es nicht ab nach Eingabe des Abbruchkommandos (120)

fehler6eece.jpg


Muss ich es irgendwie anders abbrechen? System.in.Read() wartet doch nach meinem Wissen einfach nur auf eine Eingabe während der Laufzeit oder? :confused:

Die angesprochene Möglichkeit kill -9 -PID finde ich nicht so schön, zumal es auch andere Personen administrieren sollen.
 
Moin!
120 ist der Ascii Code für den Buchstaben 'x' (daher auch //x neben der Bedingung als Kommentar). Hätt ich vielleicht dazu sagen sollen ;)

*grüssle*
MeinerEiner
 
Zurück