Wykorzystanie klasy timer przez inną klasę

0

Witajcie,
mam problem z wykorzystaniem klasy MyTimer w klasie głównej.
klasa MyTimer wygląda tak:

import java.util.Timer;
import java.util.TimerTask;
 
public class MyTimer{
    Timer timer;
    public static boolean flaga;
    int licznik = 0;
    int minuta = 0;
 
    //konstruktor
    public MyTimer(){
        timer = new Timer();
        flaga = true;
        timer.schedule( new Task(), 0 , 1000 );
    }
 
    class Task extends TimerTask{
        public void run(){
            System.out.println(licznik);
            licznik++;
 
            if( (licznik % 3) == 0 ){
                minuta++;
                System.out.println(minuta + "minuta...\n");
 
                if(minuta == 1){
                	flaga = false;
                    timer.cancel();
                }        
            }
        }
    }
  
}

Natomiast klasa Glowna tak:

public class Glowna {
	public static void main(String[] args) {
		System.out.println("start");
		new MyTimer();
		while (true){
			System.out.println(MyTimer.flaga);
			if (!MyTimer.flaga){
				System.out.println("koniec");
				System.out.println(MyTimer.flaga);
				break;
			}
		}
	}

}

Tak jak jest teraz, zakończenie pętli głównej następuje, po upływie 3 sekund, czyli tak jakbym chciał.
ale jeśli usunę pierwszą linijkę w pętli ( System.out.println(MyTimer.flaga); ), czyli pętla ma postać:

		while (true){
			if (!MyTimer.flaga){
				System.out.println("koniec");
				System.out.println(MyTimer.flaga);
				break;
			}
		}

to pętla nie chce się zakończyć (nigdy nie jest spełniony warunek (!MyTimer.flaga).
Nie rozumiem dlaczego tak się dzieje, czy mógłby ktoś pomóc w zrozumieniu tego zjawiska?

0

Standardowe pytanie, jaki SO, jaka Java. Kod jest poprawny, u mnie pętla kończy się w obu przypadkach.

0

Używam:
Windows 10
Eclipse IDE for Java Developers Version: Neon.1a Release (4.6.1)
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
U mnie tak wygląda wynik w tym drugim przypadku:
user image
Czyli tak jakby flaga była ustawiona na false, a pętla główna pracuje cały czas.

2

na szybko - nie mam czasu sprawdzić twojego kodu, ale sprawdź z tym modyfikatorem

public static **volatile **boolean flaga;

powinno być dobrze

0

Działa , dzięki
że też sam na to nie wpadłem

1 użytkowników online, w tym zalogowanych: 0, gości: 1