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

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
yanan
Sędziwy Jeż
Sędziwy Jeż
Posty: 39
Rejestracja: 22 lis 2010, 17:08
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86

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

Post 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
Awatar użytkownika
Yuri20
Sędziwy Jeż
Sędziwy Jeż
Posty: 49
Rejestracja: 31 maja 2009, 13:35
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86_64

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

Post 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.
yanan
Sędziwy Jeż
Sędziwy Jeż
Posty: 39
Rejestracja: 22 lis 2010, 17:08
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86

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

Post 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?
Awatar użytkownika
Yuri20
Sędziwy Jeż
Sędziwy Jeż
Posty: 49
Rejestracja: 31 maja 2009, 13:35
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86_64

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

Post 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.
yanan
Sędziwy Jeż
Sędziwy Jeż
Posty: 39
Rejestracja: 22 lis 2010, 17:08
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: GNOME
Architektura: x86

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

Post 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:
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 0 gości