/*
* Created on May 6, 2004
*/
package cyrille.thread;
import java.lang.ref.WeakReference;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author <a href="mailto:cleclerc@pobox.com">Cyrille Le Clerc </a>
*/
public class CascadeInterruptingThread extends Thread {
private final static Log log = LogFactory.getLog(CascadeInterruptingThread.class);
/**
* use a {@link WeakReference}instead of a strong reference to garbage as soon as possible due
* to Thread#exit() that manually dereference the runnable
*/
private WeakReference m_targetReference;
/**
*
*/
public CascadeInterruptingThread() {
super();
}
/**
* @param target
*/
public CascadeInterruptingThread(Runnable target) {
super(target);
this.m_targetReference = new WeakReference(target);
}
/**
* @param name
*/
public CascadeInterruptingThread(String name) {
super(name);
}
/**
* @param group
* @param target
*/
public CascadeInterruptingThread(ThreadGroup group, Runnable target) {
super(group, target);
this.m_targetReference = new WeakReference(target);
}
/**
* @param target
* @param name
*/
public CascadeInterruptingThread(Runnable target, String name) {
super(target, name);
this.m_targetReference = new WeakReference(target);
}
/**
* @param group
* @param name
*/
public CascadeInterruptingThread(ThreadGroup group, String name) {
super(group, name);
}
/**
* @param group
* @param target
* @param name
*/
public CascadeInterruptingThread(ThreadGroup group, Runnable target, String name) {
super(group, target, name);
this.m_targetReference = new WeakReference(target);
}
/**
* @param group
* @param target
* @param name
* @param stackSize
*/
public CascadeInterruptingThread(ThreadGroup group, Runnable target, String name, long stackSize) {
super(group, target, name, stackSize);
this.m_targetReference = new WeakReference(target);
}
/**
* @see java.lang.Thread#interrupt()
*/
@Override
public void interrupt() {
super.interrupt();
Runnable target = (Runnable) this.m_targetReference.get();
if (target instanceof Interruptible) {
Interruptible interruptible = (Interruptible) target;
interruptible.interrupt();
}
}
}