package net.i2p.util; /* * free (adj.): unencumbered; not under the control of others * Written by jrandom in 2003 and released into the public domain * with no warranty of any kind, either expressed or implied. * It probably won't make your computer catch on fire, or eat * your children, but it might. Use at your own risk. * */ import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; /** * Like {@link I2PThread} but with per-thread OOM listeners, * rather than a static router-wide listener list, * so that an OOM in an app won't call the router listener * to shutdown the whole router. * * This is preferred for application use. * See {@link I2PThread} for features. */ public class I2PAppThread extends I2PThread { private final Set<OOMEventListener> _threadListeners = new CopyOnWriteArraySet<OOMEventListener>(); public I2PAppThread() { super(); } public I2PAppThread(String name) { super(name); } public I2PAppThread(Runnable r) { super(r); } public I2PAppThread(Runnable r, String name) { super(r, name); } public I2PAppThread(Runnable r, String name, boolean isDaemon) { super(r, name, isDaemon); } /** * @since 0.9.23 */ public I2PAppThread(ThreadGroup group, Runnable r, String name) { super(group, r, name); } @Override protected void fireOOM(OutOfMemoryError oom) { for (OOMEventListener listener : _threadListeners) listener.outOfMemory(oom); } /** register a new component that wants notification of OOM events */ public void addOOMEventThreadListener(OOMEventListener lsnr) { _threadListeners.add(lsnr); } /** unregister a component that wants notification of OOM events */ public void removeOOMEventThreadListener(OOMEventListener lsnr) { _threadListeners.remove(lsnr); } }