Witam!
Mam mały problem na który nigdzie nie mogę znaleźć odpowiedzi. Mam pętle nieskończoną for(;;) i chciałbym zrobić tak aby po naciśnięciu klawisza np 0 wyrzuciło mnie z tej pętli. Zaznaczam ,że zależy mi na tym aby program nie oczekiwał po każdym przejściu pętli reakcji użytkownika i wymuszał naciśnięcie przycisku. Pobieranie zmiennej potrzebnej do wyrzucenia z pętli powinno odbywać się tak jakby w ukryciu. Nie tworzę tego w GUI . Będę wdzięczny za każdą poradę.
Stwórz nowy wątek (Thread - pogooglaj) i tam oczekuj na wpisanie "0". Gdy to się stanie, to ustaw jakąś zmienną (flagę) w klasie, która ma tego for'a nieskonczonego i w kazdym obrocie pętli sprawdzaj wartość tej flagi. Użyj AtomicBoolean jako typu flagi.
System.in udostępnia metodę available() i jeśli sobie to opakujesz np w BufferedReader to będzie metoda ready(). Być może to wystarczy.
Ale wejście jest wciąż buforowane, więc minimum "0[enter]".
Jakoś sobie poradziłem ale mam następny problem. Pomija mi break w if ;/ if na pewno się wykonuje bo wstawiłem System.out.println z wiadomością która zostaje wyrzucana na ekran ale break jest pomijany... Miał ktoś taki przypadek ?
jeśli masz podwójną pętle to zawsze z tej najbardziej wewnętrznej jedynie wychodzi
Zrobiłem przykład. Bardzo możliwe ,że coś schrzaniłem tam bo mało wiem jeszcze o javie. Jeśli naciśnie się 0 break działa natomiast jeśli najpierw wciśnie się 2 a dopiero później 0 break jest pomijany. Mógłby mi ktoś to wytłumaczyć dlaczego tak jest ?
import java.util.Scanner;
class watek extends Thread{
int a=1;
public void run(){
Scanner in=new Scanner(System.in);
a=in.nextInt();
}
}
public class Main {
public void cos()
{
watek w=new watek();
w.start();
for(;;)
{
if(w.a==2)
{System.out.println("jeszcze raz");
cos();}
if(w.a==0)
{
System.out.println("koniec");
break;}
}
}
public static void main(String[] args) {
Main a=new Main();
a.cos();
}
}
na oko w wątku, w run, również powinieneś zrobić pętlę, bo wątek, zakańcza się po wczytaniu liczby
Już zrobiłem. Wystarczyło w pętli wywoływanej przez 2 po run() dodać break :) działa teraz przydało by się rozkminić dlaczego tak jest. Dzięki wszystkim za poświęcony czas
slawek napisał(a)
Już zrobiłem. Wystarczyło w pętli wywoływanej przez 2 po run() dodać break :) działa teraz przydało by się rozkminić dlaczego tak jest. Dzięki wszystkim za poświęcony czas
poprawka... po cos() nie po run()