20 Nisan 2021 Salı

ReferenceQueue Sınıfı

Giriş
Açıklaması şöyle
Reference queues, to which registered reference objects are appended by the garbage collector after the appropriate reachability changes are detected.
ReferenceQueue belli bir <T> tipi için yazılır

WeakReference ile ReferenceQueue İlişkilendirme
Örnek
Şöyle yaparız
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
WeakReference weakReference1 = new WeakReference<>(referent, referenceQueue);
Örnek
Şöyle yaparız. Burada Foo tipinden nesneler için ReferenceQueue yaratılıyor. Daha GC işlemi gerçekleşmeden bu nesne üzerinde bir işlem yapılıyor. Aslında bu örnek çok iyi değil. Benim gördüğüm ReferenceQueue en çok Weak veri yapılarındaki kayıtları temizlemek için kullanılıyor
ReferenceQueue<Foo> fooQueue = new ReferenceQueue<Foo>();

class ReferenceWithCleanup extends WeakReference<Foo> {
  Bar bar;
  ReferenceWithCleanup(Foo foo, Bar bar) {
    super(foo, fooQueue); //<-- Burada nesne ReferenceQueue ile ilişkilendiriliyor 
    this.bar = bar;
  }
  public void cleanUp() {
    bar.cleanUp();
  }
}

public Thread cleanupThread = new Thread() {
  public void run() {
    while(true) {
      ReferenceWithCleanup ref = (ReferenceWithCleanup)fooQueue.remove();
      ref.cleanUp();
    }
  }
}

public void doStuff() {
  cleanupThread.start();
  Foo foo = new Foo();
  Bar bar = new Bar();
  ReferenceWithCleanup ref = new ReferenceWithCleanup(foo, bar);
  ... // From now on, once you release all non-weak references to foo,
      // then at some indeterminate point in the future, bar.cleanUp() will
      // be run. You can force it by calling ref.enqueue().
}

Hiç yorum yok:

Yorum Gönder