eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingOpowiadanie o GCRe: Opowiadanie o GC
  • Data: 2009-07-28 00:00:50
    Temat: Re: Opowiadanie o GC
    Od: "Jarek" <n...@t...numeru> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    Witam,

    A może takie coś pomoże.
    Mój pomysł opiera się na własnej podklasie dziedziczącej z WeakReference
    (działa też z SoftReference, tylko w innym momencie następuje czyszczenie -
    dopiero jak pamięci zabraknie).
    Moja klasa IdWeakReference przechowuje dodatkowo klucz do mapy, więc wiadomo
    co z mapy usunąć przy przetwarzaniu obiektów pobranych z ReferenceQueue.
    Testowałem i wydaje się, że działa:

    package referencetest;

    import java.lang.ref.ReferenceQueue;
    import java.lang.ref.WeakReference;
    import java.util.HashMap;
    import java.util.Map;

    public class SelfCleaningCache<ID, ITEM> {

    private Map<ID, IdWeakReference<ID, ITEM>> items = new
    HashMap<ID, IdWeakReference<ID, ITEM>>();
    private ReferenceQueue<ITEM> referenceQueue = new
    ReferenceQueue<ITEM>();
    private volatile boolean running = true;
    private Thread refQueueCleaner;

    public SelfCleaningCache() {
    System.out.println("creating RefQue cleaner");

    refQueueCleaner = new Thread(new Runnable() {

    @Override
    public void run() {
    while (running) {
    try {
    IdWeakReference<ID, ITEM> reference =
    (IdWeakReference<ID, ITEM>) referenceQueue.remove();
    System.out.println(reference.getClass());
    items.remove(reference.getId());
    System.out.println("removing map entry, id from
    reference is " + reference.getId());
    } catch (InterruptedException e) {
    System.err.println("RefQue cleaner interrupted!");
    break;
    }
    }
    }
    });
    refQueueCleaner.start();
    }

    public void put(ID id, ITEM item) {
    items.put(id, new IdWeakReference<ID, ITEM>(id, item,
    referenceQueue));
    }

    public ITEM get(Object key) {
    IdWeakReference<ID, ITEM> ref = items.get(key);
    if (ref != null) {
    return ref.get();
    } else {
    return null;
    }
    }

    public void close() {
    running = false;
    refQueueCleaner.interrupt();
    }
    }

    class IdWeakReference<ID, T> extends WeakReference<T> {

    private ID id;

    public IdWeakReference(ID id, T referent) {
    super(referent);
    this.id = id;
    }

    public IdWeakReference(ID id, T referent, ReferenceQueue<? super T> q) {
    super(referent, q);
    this.id = id;
    }

    public ID getId() {
    return id;
    }

    }



    I program testujący:




    package referencetest;

    public class RefTest {

    public static void main(String[] args) {
    SelfCleaningCache<Long, Item> cache = new SelfCleaningCache<Long,
    Item>();

    System.out.println("Creating objects");
    for (long i = 0; i < 1000000; i++) {
    cache.put(i, new Item(i));
    if (i % 10000 == 0) {
    System.out.println("id " + i);
    }
    }

    cache.close();
    }

    }

    class Item {
    private Long id;
    private Long[] table = new Long[100000];

    public Item(Long id) {
    this.id = id;
    }

    public Long getId() {
    return id;
    }

    }

    Pozdrawiam
    Jarek

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: