控制反转与java thread使用方法

早些年学习面向对象编程时候,好像没有“控制反转”概念。越来越多的编程和框架用到这个概念(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可以看作是工人或干活的人。干活的人可以是一组,这就是线程池。大道至简!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值