17 Ağustos 2018 Cuma

BlockingQueue Arayüzü

Giriş
Şu satırı dahil ederiz.
import java.util.concurrent.BlockingQueue;
Arayüzü gerçekleştiren sınıflardan bazıları ArrayBlockingQueue, DelayQueueLinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue. Şeklen şöyle


constructor
Arayüzü gerçekleştiren sınıflardan birisini kullanabiliriz.
BlockingQueue<Foo> q = new ArrayBlockingQueue<> (200);
add metodu - bloke olmaz, exception fırlatır
Eğer kuyruk doluysa, bloke olmak yerine exception atar. Exception istemiyorsak boolean sonuç dönen offer() kullanılabilir.
Throws: IllegalStateException - if this queue is full
drainTo metodu
Şöyle yaparız.
List<Foo> copy = ...;

// to grab up to 25 elements
q.drainTo (copy, 25);
element metodu - exception fırlatır,
Örnek ver

offer metodu - bloke olmaz, boolean döner
İmzası şöyle. Boolean sonuç yerine exception istiyorsak add() kullanılabilir.
public boolean offer (E e)
Şöyle yaparız. Eğer yer yoksa false döner.
boolean added = q.offer (e);
if (!added) {
  ...Do something
}
peek metodu - null döner
Örnek ver

poll metodu - bloke olmaz, null döner
null yerine exception istiyorsak, remove() kullanılabilir.
Örnek
Şöyle yaparız
/**
 * @param queue Queue containing a list of non-null elements
 */
private static <E> List<E> poll(Queue<E> queue, int n) {
  List<E> result = new ArrayList<>(n);
  for (int i = 0; i < n; i++) {
    // Could be optimized to fail fast on first null
    Optional.ofNullable(queue.poll()).ifPresent(result::add);
  }
  return result;
}
put metodu
Şöyle yaparız.
BlockingQueue< Integer > q = ...;
int i = 0;
q.put (i);
remove metodu - bloke olmaz, exception fırlatır
Exception yerine null istiyorsak, poll() kullanılabilir.

take metodu - bloke olur, null dönmez
İmzası şöyle
public E take () throws InterruptedException
Örnek
Şöyle yaparız. Eğer kuyruk boş ise bloke olur.
Foo request = q.take ();
Örnek
take metodu null dönemez. Şu kontrolü yapmak kuyruğa özellikle null konulmadıysa zorunlu değil.
if (request == null) {...}
Örnek
null kontrolü yapmadan şöyle yaparız.
private final BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
private final Thread thread = new Thread(() -> {
  try {
      while (!Thread.interrupted()) {
        queue.take().run();
      }
  } catch (Exception ex) {
     ex.printStackTrace();
  }
});


Hiç yorum yok:

Yorum Gönder