eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingOpowiadanie o GC › Re: Opowiadanie o GC
  • Path: news-archive.icm.edu.pl!newsfeed.gazeta.pl!feed.news.interia.pl!news.nask.pl!ne
    ws.nask.org.pl!news.internetia.pl!not-for-mail
    From: Michal Kleczek <k...@g...com>
    Newsgroups: pl.comp.programming
    Subject: Re: Opowiadanie o GC
    Date: Mon, 27 Jul 2009 12:09:38 +0200
    Organization: Netia S.A.
    Lines: 81
    Message-ID: <h4jv2k$5a5$1@mx1.internetia.pl>
    References: <2...@w...googlegroups.com>
    <h4jtbm$ies$1@mx1.internetia.pl>
    NNTP-Posting-Host: 77-252-124-164.ip.netia.com.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=us-ascii
    Content-Transfer-Encoding: 7Bit
    X-Trace: mx1.internetia.pl 1248690068 5445 77.252.124.164 (27 Jul 2009 10:21:08 GMT)
    X-Complaints-To: a...@i...pl
    NNTP-Posting-Date: Mon, 27 Jul 2009 10:21:08 +0000 (UTC)
    X-Tech-Contact: u...@i...pl
    User-Agent: KNode/0.10.9
    X-Server-Info: http://www.internetia.pl/news/
    Xref: news-archive.icm.edu.pl pl.comp.programming:182806
    [ ukryj nagłówki ]

    Michal Kleczek wrote:

    [ciach]
    >
    > Nie trzeba watku skanujacego - wystarczy usuwajacy. Od skanowania jest
    > java.lang.ref.ReferenceQueue
    >

    Sprobuj moze jakos tak:

    class IdMap<ID, ITEM> {

    private final Map<Reference<?>, ID> refToIdMap = new HashMap();
    private final Map<ID, Reference<ITEM>> idToRefMap = new HashMap();

    private final ReferenceQueue<ITEM> referenceQueue = new ReferenceQueue();

    //needs to be static so that we do not keep
    //reference to the parent IdMap
    private static class Remover<S, T> implements Runnable {

    //keep just a (weak) reference to parent map
    //so that we know when to finish removal
    private final Reference<IdMap<S, T>> idMapRef;

    private ReferenceQueue<T> getRefQueue() {
    IdMap<S, T> idMap = idMapRef.get();
    return idMap != null ? idMap.referenceQueue : null;
    }

    public Remover(IdMap<S, T> idMap) {
    this.idMapRef = new WeakReference<IdMap<S, T>>(idMap);
    }

    @Override
    public void run() {
    try {
    ReferenceQueue<T> referenceQueue = getRefQueue();
    while (referenceQueue != null) {
    //wait for next reference to remove
    final Reference<? extends T> itemRef = referenceQueue.remove();
    final IdMap<S, T> idMap = idMapRef.get();
    if (idMap != null) {
    idMap.remove(itemRef);
    }

    referenceQueue = getRefQueue();
    }
    }
    catch (InterruptedException e) {
    //ignore and return
    }
    }

    }

    private synchronized void remove(Reference<?> ref) {
    final ID id = refToIdMap.remove(ref);
    idToRefMap.remove(id);
    }

    public IdMap() {
    new Thread(new Remover(this)).start();
    }

    public ITEM get(ID id) {
    final Reference<ITEM> itemRef = idToRefMap.get(id);
    return itemRef != null ? itemRef.get() : null;
    }

    public synchronized void put(ID id, ITEM item) {
    final Reference<ITEM> itemRef = new WeakReference<ITEM>(item);
    idToRefMap.put(id, itemRef);
    refToIdMap.put(itemRef, id);
    }

    }


    --
    Michal

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: