摘自 http://my.oschina.net/reachwang/blog/296194
摘要
观察者模式:定义对象之间的一种一对多的依赖关系,当对象的状态发生改变时,所有依赖于它的对象都得到通知并且被自动更新。 观察者模式在JDK中有现成的实现,java.util.Obserable,如何进行监听线程,请看例子:
被监听的线程类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
package
cn.std.test;
import
java.util.Observable;
import
cn.std.util.DateUtil;
public
class
RunThread
extends
Observableimplements Runnable{
// 此方法一经调用,立马可以通知观察者,在本例中是监听线程
publicvoid doBusiness(){
if
(
true
){
super
.setChanged();
}
notifyObservers();
}
@Override
publicvoid run() {
intc =
0
;
while
(
true
){
//模拟线程运行一段时间之后退出
System.out.println(
"Runing- "
+c+
" "
+DateUtil.getStdDateTime());
try
{
Thread.sleep(
2000
);
}
catch
(InterruptedException e) {
e.printStackTrace();
doBusiness();
break
;
}
c++;
//模拟抛出异常
try
{
if
(c==
4
){
Stringstr =
null
;
str.length();
//此处将会抛出空指针异常
}
}
catch
(Exception e) {
e.printStackTrace();
doBusiness();
//在抛出异常时调用,通知观察者,让其重启线程
break
;
//异常抛出之后,一定要跳出循环,保证将线程送进地狱
}
}
}
publicstatic
void
main(String[] args) {
RunThreadrun =
new
RunThread();
Listener listen =
new
Listener();
un.addObserver(listen);
newThread(run).start();
//run.doBusiness();
}
}
|
被监听的线程需要继承Observable类,继承之后轻松变身为被观察者doBusiness方法,此处可以加上你的业务处理内容,接下来是Listener
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package
cn.std.test;
import
java.util.Observable;
import
java.util.Observer;
public
class
Listener
implements
Observer{
@Override
publicvoid update(Observable o, Object arg) {
System.out.println(
"RunThread死机"
);
RunThreadrun =
new
RunThread();
run.addObserver(
this
);
newThread(run).start();
System.out.println(
"RunThread重启"
);
}
}
|
很简单,只要实现Observer接口,实现其update方法,在方法内部重启线程