Strona 1 z 1

[Java] Usuwanie wątku po określonym czasie

: 05 lip 2013, 19:34
autor: yanan
Witam

Mam pytanie w jaki sposób usunąć wątek, gdy okaże się, że nie uda się go wykonać np. gdy w jego implementacji znajdzie się pętla nieskończona typu while(1). Chciałbym dać mu jakiś czas np. 30 sekund

Do tej pory tworzyłem wątki, ale nie było opcji żeby się on nie skończył w sensie miały warunek stopu.

Pozdrawiam
yanan

Re: [Java] Usuwanie wątku po określonym czasie

: 06 lip 2013, 16:15
autor: Yuri20
No to bierzesz i piszesz wewnątrz while'a licznik czasu jaki minął od pierwszej iteracji pętli i jeśli zostanie przekroczona jakaś magiczna granica to robisz break i koniec. Nie masz usuwać wątka, tylko masz zrobić, żeby wątek sam się usunął, przynajmiej taka kolej rzeczy wydaje mi się logiczniejsza. Ewentualnie możesz zrobić to na ilość iteracji, miałbyś licznik, który by się inkrementował, plus jest taki, że byłoby to dużo wydajniejsze.

Re: [Java] Usuwanie wątku po określonym czasie

: 06 lip 2013, 21:07
autor: yanan
Ok, no to czekaj mam taką sytuację, że wątek odpalam przez start i klasa dziedziczy po klasie Thread

Wywołanie z menu i wykrycie zdarzenia:

Kod: Zaznacz cały

@Override
		public void actionPerformed(ActionEvent arg0) {
			Action a= new Action(parametry);
			a.start();
		
			
		}
Wnętrze klasy Action
public void run() {

Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("program_pętli.bat");
}

Jak i gdzie wrzucić jakiś czasomierz, bo licznik iteracji to chyba się nie nada do tego przykładu?

Re: [Java] Usuwanie wątku po określonym czasie

: 08 lip 2013, 14:15
autor: Yuri20
Uh, no to może być ciężko.

Kod: Zaznacz cały

class Watek extends Thread{
    public int a;
    public boolean active = true;
    class InnerMonitor extends Thread{
        int TIME_LIMIT = 2;
        public InnerMonitor(){
            super();
        }
        synchronized public void run(){
            Long a = System.currentTimeMillis();
            Long b = null;
            while(true){
                try{
                this.wait(500);
                b = System.currentTimeMillis();
                Watek.this.a = (int)((b-a)/1000);
                if(Watek.this.a > this.TIME_LIMIT){
                    Watek.this.stop();
                    this.stop();
                }
                } catch(InterruptedException e){
                    
                }
            }
        }
    }
    public Watek(){
        super();
        this.a = 0;
    }
    
    public void run(){
        InnerMonitor in = new InnerMonitor();
        in.setPriority(MAX_PRIORITY);
        in.start();
        while(true){
            System.out.println("Mineło "+String.valueOf(this.a));
        }
    }
}
public class Thready {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Watek w = new Watek();
        w.start();
    }
}
Tworzymy więc klasę wewnętrzną, która też jest wątkiem, będziemy mieli więc wątek w wątku :D. Drugi wątek odlicza czas i odwołuje się do metody .stop() klasy zewnętrznej, kiedy minie TIME_LIMIT, siebie potem też zatrzymuje. Niestety metoda stop jest już przestarzała, musiałem jej użyć ponieważ .interrupt() nie kwapiła się, żeby działać. Gdyby pętla while (mowa o klasie zewnętrznej) znajdowałą się w środku run(), wtedy możnaby zatrzymać poprzez sprawdzanie warunku do dalszej iteracji while'a. W każdym razie działa, powinno wystarczyć, że przeniesiesz klasę wewnętrzną do swojej klasy wątku i uruchomisz w metodzie run() klasy zewnętrznej.

wait(500) jest po to, żeby czas nie był sprawdzany na gwałt i nie zużywał procesora ile wlezie. Można te 500 ewentualnie trochę zmniejszyć.

EDIT:
No tak, interrupt() nie ma za zadanie przerwać wątek, tylko ustawić stan na interrupted. Zatem w przypadkach kiedy za najwyższym elementem kontroli przepływu wątku stoi pętla while, to można zgrabnie za warunek wcisnąć ! isIntrrupted(). Troche trudniej jest przerwać wątek bez przestarzałego stop(), kiedy tej pętli while nie ma, ale są i na to rozwiązania.

Re: [Java] Usuwanie wątku po określonym czasie

: 11 lip 2013, 22:13
autor: yanan
Dzięki męczyłem się z tym chyba z tydzień najpierw w c++, a potem w javie, a w taką pogodę ciężko patrzeć na ekran monitora... rozwiązanie problemu okazuje się nie takie banalne... ale grunt, że zadziała... :clap: