de.intarsys.tools.resourcetracker.ResourceFinalizer Maven / Gradle / Ivy
Show all versions of isrt Show documentation
/*
* Copyright (c) 2007, intarsys consulting GmbH
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* - Neither the name of intarsys nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
package de.intarsys.tools.resourcetracker;
import java.lang.ref.ReferenceQueue;
/**
* A thread for monitoring a reference queue.
*
* This monitor is decoupled from the {@link ResourceTracker} instance to allow
* for heterogenous resources to be tracked in a single thread.
*
*/
public class ResourceFinalizer extends Thread {
private static ResourceFinalizer DEFAULT;
synchronized public static ResourceFinalizer get() {
if (DEFAULT == null) {
DEFAULT = new ResourceFinalizer();
}
return DEFAULT;
}
final private ReferenceQueue queue = new ReferenceQueue();
private boolean started = false;
public ResourceFinalizer() {
super("resource finalizer");
// todo some resources must really be finalized
// todo invent more intelligent shutdown
setDaemon(true);
}
protected void drainQueue() {
while (true) {
IResourceReference ref = (IResourceReference) queue.poll();
if (ref == null) {
return;
} else {
ref.dispose();
}
}
}
synchronized protected void ensureStarted() {
if (started) {
return;
}
start();
}
public ReferenceQueue getQueue() {
return queue;
}
@Override
public void run() {
while (true) {
try {
PhantomResourceReference ref = (PhantomResourceReference) queue
.remove();
if (ref != null) {
ref.dispose();
}
} catch (Exception e) {
return;
}
}
}
@Override
public synchronized void start() {
started = true;
super.start();
}
}