[Java] Usuwanie wątku po określonym czasie
-
- 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
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
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
- Yuri20
- 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
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.
-
- 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
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:
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?
Wywołanie z menu i wykrycie zdarzenia:
Kod: Zaznacz cały
@Override
public void actionPerformed(ActionEvent arg0) {
Action a= new Action(parametry);
a.start();
}
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?
- Yuri20
- 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
Uh, no to może być ciężko.
Tworzymy więc klasę wewnętrzną, która też jest wątkiem, będziemy mieli więc wątek w wątku . 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.
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();
}
}
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.
-
- 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
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...
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 0 gości