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 }