1. Thread.isInterrupted metodu
Metodun içi şöyle. Kendi içindeki private isInterrupted() metodunu çağırır. Bu metod bayrağı temizlemez!
Şöyle yaparız.
Örnek
Bu metod içinde şöyle yapmamalıyız. Çünkü bu exception'ı yakaladıktan sonra hangi kodun çalışacağı ve bizim beklediğimiz bayrağın atanmış olduğu garanti değil.
Şöyle yaparız. Böylece bayrağın tekrar atanmış olduğunu garanti ederiz.
3. Thread.interrrupted metodu - static
Metodun içi şöyle. Bu metod bayrağı temizler!
Şöyle yaparız.
Exception yakalandıktan sonra "interrupt status" bayrağını tekrar kaldırmak gerekir.
Örnek
Şöyle yaparız.
Şöyle yaparız
Yanlış kullanım şöyledir.
Metodun içi şöyle. Kendi içindeki private isInterrupted() metodunu çağırır. Bu metod bayrağı temizlemez!
public boolean isInterrupted ( ) {
return isInterrupted(false);
}
ÖrnekŞöyle yaparız.
System.out.println(t.isInterrupted ());
2. catch (InterruptedException ex) İçindeÖrnek
Bu metod içinde şöyle yapmamalıyız. Çünkü bu exception'ı yakaladıktan sonra hangi kodun çalışacağı ve bizim beklediğimiz bayrağın atanmış olduğu garanti değil.
Thread.currentThread().isInterrupted()
ÖrnekŞöyle yaparız. Böylece bayrağın tekrar atanmış olduğunu garanti ederiz.
try {
queue.poll(3000, TimeUnit.MILLISECONDS);
} catch (InterruptedException ex) {
...
Thread.currentThread().interrupt(); // restore interrupt
}
Metodun içi şöyle. Bu metod bayrağı temizler!
static boolean interrupted ( ) {
Thread me = Thread.currentThread();
return me.isInterrupted(true);
}
ÖrnekŞöyle yaparız.
@Override
public synchronized void run() {
while(!Thread.interrupted()) {
...
}
}
Koşul ile kullanmak istersek şöyle yaparız.@Override
public synchronized void run() {
while (yourFinishCondition && !Thread.interrupted()) {
...
}
}
Doğru KullanımException yakalandıktan sonra "interrupt status" bayrağını tekrar kaldırmak gerekir.
Örnek
Şöyle yaparız.
while (!Thread.interrupted()) {
try {
...;
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // restore interrupted status
return; // or return
}
}
ÖrnekŞöyle yaparız
while (!Thread.currentThread().isInterrupted()) {
try {
queue.poll(3000, TimeUnit.MILLISECONDS);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
Yanlış KullanımYanlış kullanım şöyledir.
while (!Thread.currentThread().isInterrupted()) {
try {
...
} catch (InterruptedException e) {
... //Burada bayrak kaldırılmıyor
}
}
Hiç yorum yok:
Yorum Gönder