1 /*** 2 * 3 */ 4 package de.cohesion.bssh.impl.lang; 5 6 import java.util.Set; 7 import java.util.concurrent.CopyOnWriteArraySet; 8 import java.util.concurrent.ThreadFactory; 9 10 /*** 11 * @author schulzs 12 */ 13 public class NotifyingThread extends Thread { 14 15 public static final ThreadFactory FACTORY = new ThreadFactory() { 16 public Thread newThread(Runnable r) { 17 return new NotifyingThread(r); 18 } 19 }; 20 21 private final Set<ThreadStateListener> listeners; 22 23 public NotifyingThread(Runnable target) { 24 super(target); 25 listeners = new CopyOnWriteArraySet<ThreadStateListener>(); 26 } 27 28 public NotifyingThread(ThreadGroup group, Runnable target, String name, 29 long stackSize) { 30 super(group, target, name, stackSize); 31 listeners = new CopyOnWriteArraySet<ThreadStateListener>(); 32 } 33 34 @Override 35 public void interrupt() { 36 super.interrupt(); 37 broadcast(); 38 } 39 40 public void addThreadStateListener(ThreadStateListener listener) { 41 listeners.add(listener); 42 } 43 44 public void removeThreadStateListener(ThreadStateListener listener) { 45 listeners.remove(listener); 46 } 47 48 protected void broadcast() { 49 for (ThreadStateListener l : listeners) { 50 l.stateChanged(this, getState()); 51 } 52 } 53 54 }