Endlosschleife abbrechen

ocsme

Top Contributor
Hallo zusammen,

ich würde sehr gerne eine Endlosschleife in einem Thread über eine Taste abbrechen doch ich bekomme es leider nicht hin.
Habe zwei Klassen die sehen wie folgt aus:
Java:
public class Barrier extends Thread {

    private String name;
    private int open, close;

    Barrier(String name, int open, int close) {
        this.name = name;
        this.open = open;
        this.close = close;
    }

    int getOpen() {
        return open;
    }

    int getClose() {
        return close;
    }

    String getBarrier() {
        return name;
    }

    void setOpen(int open) {
        this.open = open;
    }

    void setClose(int close) {
        this.close = close;
    }

    void setBarrier(String name) {
        this.name = name;
    }

    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                System.out.println("Barrier " + getBarrier() + ": Start Opening");
                sleep(80);
                System.out.println("Barrier " + getBarrier() + ": End Opening");
                sleep(getOpen());
                System.out.println("Barrier " + getBarrier() + ": Start Closing");
                sleep(60);
                System.out.println("Barrier " + getBarrier() + ": End Closing");
                sleep(getClose());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
    
}

Java:
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {   
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);

        System.out.println("Soll das Programm in Endlosschleife gestartet werden?");
        boolean endless = s.nextBoolean();
        if (!endless) {
            System.out.println("Bitte geben Sie die Anzahl der Ausfahren ein: ");
            try {
                int anz = s.nextInt();
                Barrier[] barriers = new Barrier[anz];
                for (int i = 0; i < anz; i++) {
                    System.out.println("Wartezeit (Ausfahrt" + (i + 1) + ") geoeffnet in s: ");
                    int open = s.nextInt();
                    System.out.println("Wartezeit (Ausfahrt" + (i + 1) + ")geschlossen in s: ");
                    int close = s.nextInt();
                    barriers[i] = new Barrier(Integer.toString(i + 1), open, close);
                }
                for (int i = 0; i < anz; i++) {
                    barriers[i].start();
                }
            } catch (Exception x) {
                x.printStackTrace();
            }
        }

        s.close();

    }

}

Nun dachte ich in der Main Klasse eine Innere Klasse zu machen die so aussieht:

Java:
class Breakk extends Thread {
      BufferedReader br;
      
      public Breakk() {
         br = new BufferedReader(new InputStreamReader(System.in));
      }
      
      public void run() {
         char c = 0;
         while(c != ' ') {
            try {
               c = (char)br.read();
            }
            catch(IOException e) {
               System.out.println("Fehler beim Lesen von der Tastatur!");
            }
         }
         System.exit(0);
      }
   }

Jetzt wollte ich sehr gerne wenn man in der Main sagt Endlosschleife das ich diese Klasse nutzen könnte doch das klappt so nicht :-(
Leider war ich mal wieder eine längere Zeit Krank und hab gerade das Gefühl man fängt wieder bei NULL an 🙁
 
und was soll das für eine condition sein?
Das soll doch mein Tastendruck sein oder stehe ich jetzt ganz auf dem Schlauch =D

so bricht man doch nur Sequenzielle Endlosschleifen ab wie du das oben geschrieben hast oder?
 
kann ich also einfach so etwas machen:
Java:
if(br.readLine().equals("break"))

Wenn dann break geschrieben wurde bricht es z. B. ab.
 
ahha okay glaube dann funktioniert mein Konstrukt so nur nicht!
Werde mal sehen ob ich das hin bekomme 🙂

Danke für die Hilfe 🙂
 
Wobei ich gerade sehe, dass Du ja in Deiner "Endlosschleife" sowieso die Eingabe abfragst, d. h. hier kannst Du das tatsächlich einfach in der Schleife abfragen:

Code:
while (true) {
    s := eingabe
    Falls "break" eingegeben wurde: break
    ...
}
 
So hab es hin bekommen doch nur so naja!
Musste in der meiner Barrier Klasse einen boolean einfügen. Geht es auch irgendwie anders?
Hier erst einmal der Code:
Main:
Java:
package Uebung1;

import java.util.Scanner;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        System.out.println("Bitte geben Sie die Anzahl der Ausfahren ein: ");
        int anz = s.nextInt();
        Barrier[] barriers = new Barrier[anz];

        for (int i = 0; i < anz; i++) {
            System.out.println("Wartezeit (Ausfahrt" + (i + 1) + ") geoeffnet in s: ");
            int open = s.nextInt();
            System.out.println("Wartezeit (Ausfahrt" + (i + 1) + ")geschlossen in s: ");
            int close = s.nextInt();
            barriers[i] = new Barrier(Integer.toString(i + 1), open, close, -1);
        }

        for (int i = 0; i < anz; i++) {
            barriers[i].start();
        }
        try {
            while (true) {
                char c = (char) br.read();
                if (c == 'q') {
                    for (Barrier v : barriers)
                        v.setRunning(false);
                    System.exit(0);
                }
            }
        } catch (IOException ex) {
            ex.getStackTrace();
        }

        s.close();

    }
}

Barrier:
Java:
package Uebung1;

public class Barrier extends Thread {

    private String name;
    private int open, close, amount;
    private boolean running = true;

    Barrier(String name, int open, int close, int amount) {
        this.name = name;
        this.open = open;
        this.close = close;
        this.amount = amount;
    }

    int getOpen() {
        return open;
    }

    int getClose() {
        return close;
    }

    int getAmount() {
        return amount;
    }
    String getBarrier() {
        return name;
    }

    void setOpen(int open) {
        this.open = open;
    }

    void setClose(int close) {
        this.close = close;
    }

    void setBarrier(String name) {
        this.name = name;
    }
    
    void setRunning(boolean running) {
        this.running = running;
    }

    public void run() {
        while(amount != 0 && running) {
            try {
                System.out.println("Barrier " + getBarrier() + ": Start Opening");
                sleep(80);
                System.out.println("Barrier " + getBarrier() + ": End Opening");
                sleep(getOpen());
                System.out.println("Barrier " + getBarrier() + ": Start Closing");
                sleep(60);
                System.out.println("Barrier " + getBarrier() + ": End Closing");
                sleep(getClose());
                amount--;
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
    
}


Hab ich das nun richtig verstanden:
Ich starte die Main.java gebe alles Sequenziell ein bis es an dieser Stelle interessant wird:
Java:
  for (int i = 0; i < anz; i++) {

            barriers[i].start();

        }
Nun werden die anz Threads erstellt und laufen bei der Eingabe von -1 Endlos. Das Programm hängt aber nicht in diesem Block fest sondern läuft Sequenziell weiter in die while(true) Schleife. In dieser ändere ich dann für jedes Objekt den boolean Wert von running auf false. Die Threads die daran arbeiten überprüfen den boolean wert und brechen ab.
Jetzt hänge ich vom Kopf her wieso gehen diese dann nicht auch weiter im Programmcode =( Weil es nur "Threads" sind, die dazu keine Berechtigung haben da sie nur für das Objekt barrier gestartet wurden?

Ahhh Sequenzielle Programme sind ja schon Kompliziert doch hiermit wird es ja noch schlimmer :-D
 
Ich bin mir unsicher, ob ich dich richtig verstehe, aber ich hätte es in etwa so versucht:
Java:
public class Barrier extends TimerTask {
    private char c;

    public Barrier(char c) {
        this.c = c;
    }

    @Override
    public void run() {
        System.out.println("Hello " + c);
    }

    public static void main(String[] args) throws IOException {
        Timer timer = new Timer();

        timer.schedule(new Barrier('A'), 0, 1000);
        timer.schedule(new Barrier('B'), 0, 1000);

        System.in.read();

        System.out.println("Got you!");
        timer.cancel();
    }
}

Dieses Beispiel gibt bis zur Eingabe (brauch aber einmal Enter) wiederholt "Hallo A" und "Hallo B" aus.
 
Danke doch leider hatte ich das alles noch nicht TimerTask und Timer (timer.schedlue). Da müsste ich mir die Klasse erst mal anschauen 🙂
Doch wie gesagt Danke 🙂
 

Zurück
Oben