您的位置:首页 > 编程语言 > Java开发

控制反转与java thread使用方法

2012-02-15 23:07 239 查看
早些年学习面向对象编程时候,好像没有“控制反转”概念。越来越多的编程和框架用到这个概念(Spring, Android等等),下面是摘自维基百科的资料和Java教材中Thread的使用放在一起,可以好好体会下这个概念。

控制反转(英语:Inversion
of control,缩写为IoC),也叫做依赖注入Dependency
Injection
,简称DI),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度


打破依赖

如果类X的一个实例对象x调用了类Y的一个实例对象y的方法,那么就称类X依赖于类Y。为了打破这种依赖——“反转”,首先我们可以引入一个接口I(第三方类),接口I中声明了对象y将被对象x调用的所有方法;然后,我们对类Y稍加改造,使其实现接口I;最后,我们把在对象x中对y的调用改为对接口I中对应方法的调用。经过这番改造后,原先的X对Y的依赖关系不存在了,类X和Y现在都依赖于接口I。

这种通过引入接口I来消除类X对Y的依赖的方法,被称作“控制反转”,又叫做“依赖注入”。

需要注意的是,类Y可能还依赖于其他类。在应用反转之前,X依赖于Y,从而也间接依赖于Y所依赖的所有“其他类”。应用控制反转之后,不仅X对Y的直接依赖,且前面提到的那些所有的间接依赖也消除了。而新引入的接口I则不依赖于任何类。

class PrintServer2 {
private final PrintQueue requests = new PrintQueue();
public PrintServer2() {
Runnable service = new Runnable() {
public void run() {
for(;;)
realPrint(requests.remove());
}
};
new Thread(service).start();
}
public void print(PrintJob job) {
requests.add(job);
}
private void realPrint(PrintJob job) {
// do the real work of printing
}
}


其中Runnable是接口I,PrintServer2是类X,而Thread是类Y。这里PrintServer2不直接依赖Thread,同时也是一种控制反转:即系统定义的类成员调用应用定义类的成员,或者说是长辈调用晚辈的方法。教材中也提到可以使用extends Thread的方法,实现线程,但是这种方法不如使用上面Runnable方法灵活。Runnable可以看作是一系列的工作或任务,而Thread可以看作是工人或干活的人。干活的人可以是一组,这就是线程池。大道至简!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: