5 Kasım 2019 Salı

Thread ve Interrupt Kullanımı

1. Thread.isInterrupted metodu
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
}

3. Thread.interrrupted metodu - static
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ım
Exception 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ım
Yanlış kullanım şöyledir.
while (!Thread.currentThread().isInterrupted()) {
  try {
    ...
  } catch (InterruptedException e) {
    ... //Burada bayrak kaldırılmıyor
  }
}

Hiç yorum yok:

Yorum Gönder