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
. 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.