View Javadoc

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  }