欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

只关心的是调用Callb 劳务派遣信息管理系统 ack接口回传必要的信息即可

点击: 次  来源:宝鼎软件 时间:2017-06-02

原文出处: 五月的仓颉

模块间挪用

在一个应用系统中,无论利用何种语言开拓,一定存在模块之间的挪用,挪用的方法分为几种:

(1)同法式用

只体贴的是挪用Callb 劳务调派信息打点系统 ack接口回传须要的信息即可

同法式用是最根基而且最简朴的一种挪用方法,软件开发,类A的要领a()挪用类B的要领b(),一直期待b()要领执行完毕,a()要领继承往下走。这种挪用方法合用于要领b()执行时间不长的环境,因为b()要领执行时间一长可能直接阻塞的话,a()要领的余下代码是无法执行下去的,这样会造成整个流程的阻塞。

(2)异法式用

只体贴的是挪用Callb 劳务调派信息打点系统 ack接口回传须要的信息即可

异法式用是为了办理同法式用大概呈现阻塞,导致整个流程卡住而发生的一种挪用方法。类A的要领要领a()通过新起线程的方法挪用类B的要领b(),代码接着直接往下执行,这样无论要领b()执行时间多久,都不会阻塞住要领a()的执行。可是这种方法,由于要领a()不期待要领b()的执行完成,在要领a()需要要领b()执行功效的环境下(视详细业务而定,有些业务好比启异步线程发个微信通知、刷新一个缓存这种就没须要),必需通过必然的方法对要领b()的执行功效举办监听。在Java中,可以利用Future+Callable的方法做到这一点,详细做法可以拜见我的这篇文章Java多线程21:多线程下其他组件之CyclicBarrier、Callable、Future和FutureTask。

(3)回调

只体贴的是挪用Callb 劳务调派信息打点系统 ack接口回传须要的信息即可

最后是回调,回调的思想是:

  • 类A的a()要领挪用类B的b()要领
  • 类B的b()要领执行完毕主动挪用类A的callback()要领
  • 这样一种挪用方法构成了上图,也就是一种双向的挪用方法。

    代码示例

    接下来看一下回调的代码示例,代码模仿的是这样一种场景:老师问学生问题,学生思考完毕答复老师。

    首先界说一个回调接口,只有一个要领tellAnswer(int answer),即学生思考完毕汇报老师谜底:

    /**
     * 回调接口,原文出处http://www.cnblogs.com/xrq730/p/6424471.html
     */
    public interface Callback {
    
        public void tellAnswer(int answer);
    
    }

    界说一个老师工具,实现Callback接口:

    /**
     * 老师工具,原文出处http://www.cnblogs.com/xrq730/p/6424471.html
     */
    public class Teacher implements Callback {
    
        private Student student;
    
        public Teacher(Student student) {
            this.student = student;
        }
    
        public void askQuestion() {
            student.resolveQuestion(this);
        }
    
        @Override
        public void tellAnswer(int answer) {
            System.out.println("知道了,你的谜底是" + answer);
        }
    
    }

    老师工具有两个public要领:

    (1)回调接口tellAnswer(int answer),即学生答复完毕问题之后,老师要做的工作

    (2)问问题要领askQuestion(),即向学生问问题

    接着界说一个学生接口,学生虽然是办理问题,可是吸收一个Callback参数,这样学生就知道办理完毕问题向谁陈诉:

    /**
     * 学生接口,原文出处http://www.cnblogs.com/xrq730/p/6424471.html
     */
    public interface Student {
    
        public void resolveQuestion(Callback callback);
    
    }

    最后界说一个详细的学生叫Ricky:

    /**
     * 一个名叫Ricky的同学办理老师提出的问题,原文出处http://www.cnblogs.com/xrq730/p/6424471.html
     */
    public class Ricky implements Student {
    
        @Override
        public void resolveQuestion(Callback callback) {
            // 模仿办理问题
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
    
            }
    
            // 回调,汇报老师功课写了多久
            callback.tellAnswer(3);
        }
    
    }

    在办理完毕问题之后,第16行向老师陈诉谜底。

    写一个测试类,较量简朴:

    /**
     * 回调测试,原文出处http://www.cnblogs.com/xrq730/p/6424471.html
     */
    public class CallbackTest {
    
        @Test
        public void testCallback() {
            Student student = new Ricky();
            Teacher teacher = new Teacher(student);
    
            teacher.askQuestion();
    
        }
    
    }

    代码运行功效就一行:

    知道了,你的谜底是3

    简朴总结、阐明一下这个例子就是:

    (1)老师挪用学生接口的要领resolveQuestion,向学生提问

    (2)学生办理完毕问题之后挪用老师的回调要领tellAnswer

    这样一套流程,组成了一种双向挪用的干系。

    代码阐明

    阐明一下上面的代码,上面的代码我这里做了两层的抽象:

    (1)将老师举办抽象

  • 将老师举办抽象之后,对付学生来说,就不需要体贴到底是哪位老师询问我问题,只要我按照询问的问题,得出谜底,然后汇报提问的老师就可以了,纵然老师换了一茬又一茬,对我学生而言都是没有任何影响的