renderThread.interrupt() nie przerwać nić, to nadal uruchomić.
- Jeśli wątek jest wykonywany i
interrupt()
wywoływana jest to stan przerwania jest ustawiony.
- Jeśli ten wątek jest zablokowany w wywołaniu jednej z
wait
metod klasy Object lub z Thread.join
i Thread.sleep
metod tej klasy następnie jego status przerwania zostanie skasowana i będzie on posiadać InterruptedException
.
Na przykład
Thread t = new Thread()
{
public void run()
{
try {
for(int i=0; i<10000;i++)
System.out.println("Is interrupTed? "+this.isInterrupted());
Thread.sleep(200);
} catch (InterruptedException ex) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
}
}
};
t.start();
t.interrupt();
}
Powyższy kodu, które stosuje się for
pętli przechwycić flagę interrput z isInterrupted()
funkcji i wydrukowany. Po wywołaniu t.interrupt()
, isInterrupted()
zwróci true
, który zobaczysz w konsoli. Jak tylko dotrze do Thread.sleep(miliTime)
, zostanie wykryty, że został przechwycony InterruptedException
, który został zgłoszony zgodnie z powyższym opisem.
Zatrzymywanie wątek:
można skorzystać z tej kontroli isInterrupted()
flagi jeśli interrupt()
została wywołana na nim i powrócić z wykonania:
Na przykład:
Thread t = new Thread()
{
public void run()
{
long executeTime = System.currentTimeMillis() ;
int i = 0;
for(; i<10000 && !this.isInterrupted();i++)
System.out.println("Is interrupted? "+this.isInterrupted());
System.out.println("Was Interrupted? "+this.isInterrupted()
+" after cycle: "+ i);
System.out.println("Time it gets Executed: "
+(System.currentTimeMillis() - executeTime+" ms"));
}
};
t.start();
try {
Thread.sleep(200);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
t.interrupt();
Podczas pracy z powyższym kodem: wysłałem główny wątek do uśpienia dla 200
wewnątrz statycznego główna funkcja pozwalająca uruchomionemu wątkowi t
działać przez pewien czas. Wtedy wywoływany
t.interrupt()
na nim co powoduje pętlę for
się zatrzymać i wydrukować dane wyjściowe w następujący sposób:
Was Interrupted? true after cycle: 1477
Time it gets Executed: 258 ms
Co wskazuje, że pętla for
ma 1148
iteracji przed t.interrupt();
został wywołany w funkcji main
. Aby uzyskać więcej informacji, należy zapoznać się z dokumentacją funkcji Thread.interrupt()
.
Dlaczego uważasz, że wywołanie 'interrupt' spowoduje _stop_ wątku'? –
możliwy duplikat [Jak właściwie zatrzymać wątek w Javie] (http://stackoverflow.com/questions/10961714/how-to-properly-stop-the-thread-in-java) –
@SotiriosDelimanolis Ponieważ, potocznie, "przerywanie czegoś" i "zatrzymywanie czegoś" są synonimami. Nie mówię, że to właśnie to * robi * (i dokumentacja jest dobrym miejscem do rozpoczęcia rozwijania założenia), ale nazwa jest ładowana. – user2864740