回调以及异步调用

来源出处:点击打开链接

例子1

首先看一段代码:

模板方式:

public abstract class B{
     public void execute(){
            getConnection();
            doCRUD();
            releaseConnection();
        }    

      public abstract void doCRUD();  

      public void getConnection(){
            System.out.println("获得连接...");
        }    

        public void releaseConnection(){
            System.out.println("释放连接...");
        }
}  

public class A extends B{
    public void doCRUD(){
          System.out.println("执行add操作...");
     }    

     public void add(){
             doCRUD();
        }
}  

public class C extends B{
    public void doCRUD(){
          System.out.println("执行delete操作...");
     }    

     public void delete(){
             doCRUD();
        }
 }

改为回调模式:

public interface CallBack{
    public void doCRUD();
}
package huidiao.sample;

public class HibernateTemplate {
    public void execute(CallBack action){
        getConnection();
        action.doCRUD();
        releaseConnection();
    }    

    public void add(){
         execute(new CallBack(){
            public void doCRUD(){
                System.out.println("执行add操作...");
            }
         });
     }     

     public void delete(){
         execute(new CallBack(){
            public void doCRUD(){
                System.out.println("执行delete操作...");
            }
         });
     }   

    public void getConnection(){
        System.out.println("获得连接...");
    }    

    public void releaseConnection(){
        System.out.println("释放连接...");
    }    

} 

可见摒弃了继承抽象类方式的回调方式更加简便灵活。不需要为了实现抽象方法而总是继承抽象类,而是只需要通过回调来增加一个方法即可,更加的直观简洁灵活。这算是回调的好处之一。

下面再给出一个关于利用回调配合异步调用的很不错的例子,

例子2

回调接口: 

public interface CallBack {
    /**
     * 执行回调方法
     * @param objects   将处理后的结果作为参数返回给回调方法
     */
    public void execute(Object... objects );
}

消息的发送者:

/**
 * 这个类相当于你自己
 */
public class Local implements CallBack,Runnable{    

    private Remote remote;    

    /**
     * 发送出去的消息
     */
    private String message;    

    public Local(Remote remote, String message) {
        super();
        this.remote = remote;
        this.message = message;
    }    

    /**
     * 发送消息
     */
    public void sendMessage()
    {
        /**当前线程的名称**/
        System.out.println(Thread.currentThread().getName());
        /**创建一个新的线程发送消息**/
        Thread thread = new Thread(this);
        thread.start();
        /**当前线程继续执行**/
        System.out.println("Message has been sent by Local~!");
    }    

    /**
     * 发送消息后的回调函数
     */
    public void execute(Object... objects ) {
        /**打印返回的消息**/
        System.out.println(objects[0]);
        /**打印发送消息的线程名称**/
        System.out.println(Thread.currentThread().getName());
        /**中断发送消息的线程**/
        Thread.interrupted();
    }    

    public static void main(String[] args)
    {
        Local local = new Local(new Remote(),"Hello");    

        local.sendMessage();
    }    

    public void run() {
        remote.executeMessage(message, this);  //这相当于给同学打电话,打完电话之后,这个线程就可以去做其他事情了,只不过等到你的同学打回电话给你的时候你要做出响应  

    }
}    

消息的接收者:

/**
 * 这个类相当于你的同学
 */
public class Remote {    

    /**
     * 处理消息
     * @param msg   接收的消息
     * @param callBack  回调函数处理类
     */
    public void executeMessage(String msg,CallBack callBack)
    {
        /**模拟远程类正在处理其他事情,可能需要花费许多时间**/
        for(int i=0;i<1000000000;i++)
        {    

        }
        /**处理完其他事情,现在来处理消息**/
        System.out.println(msg);
        System.out.println("I hava executed the message by Local");
        /**执行回调**/
        callBack.execute(new String[]{"Nice to meet you~!"});  //这相当于同学执行完之后打电话给你
    }    

}   

执行Local类的main方法。

注意Local类中红色背景的那行:

remote.executeMessage(message, this);

executeMessage方法需要接收一个message参数,表示发送出去的消息,而CallBack参数是他自己,也就是这里的this。表示发送消息后,由Local类自己来处理,调用自身的execute方法来处理消息结果。

如果这里不是用this,而是用其他的CallBack接口的实现类的话,那就不能称之为“回调”了,在OO的世界里,那就属于“委派”。也就是说,“回调”必须是消息的发送者来处理消息结果,否则不能称之为回调。这个概念必须明确。

时间: 2024-08-25 16:01:14

回调以及异步调用的相关文章

利用回调实现Java的异步调用

异步是指调用发出后,调用者不会立刻得到结果,而是在调用发出后,被调用者通知调用者,或通过回调函数处理这个调用. 回调简单地说就是B中有一个A,这样A在调用B的某个方法时实际上是调用到了自己的方法. 利用回调可以实现Java的异步调用,下面的例子来自网上. 回调接口: public interface CallBack { /** * 执行回调方法 * @param objects 将处理后的结果作为参数返回给回调方法 */ public void execute(Object... object

深入浅出: Java回调机制(异步)

Writer      :BYSocket(泥沙砖瓦浆木匠) 什么是回调?今天傻傻地截了张图问了下,然后被陈大牛回答道"就一个回调-".此时千万个草泥马飞奔而过(逃 哈哈,看着源码,享受着这种回调在代码上的作用,真是美哉.不妨总结总结. 一.什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用. 回调是一种特殊的调用,至于三种方式也有点不同. 1.同步

java三种调用方式(同步调用/回调/异步调用)

1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口 ) 实例2:老师平时学生布置任务后不可能一直等待和监督学生完成,老师通常会告诉学生,任务完成后给他打个电话或者发个信息,那么学生给老师返回结果的过程需要老师信息,这就是一个回调的过程.

Effective JavaScript Item 62 在异步调用中使用嵌套或者命名的回调函数

在一开始,理解异步程序的调用顺序会有些困难.比如,下面的程序中,starting会先被打印出来,然后才是finished: downloadAsync("file.txt", function(file) { console.log("finished"); }); console.log("starting"); downloadAsync方法在执行之后会立即返回,它只是为下载这个行为注册了一个回调函数而已. 由于JavaScript"

Silverlight中异步调用WCF服务,传入回调函数

以前学的ASP.NET,调用的都是同步方法,同步方法的好处就是,一步一步走,完成这步才会走下一步.然而,WCF使用的都是异步方法,调用之后不管有没有获得结果就直接往下走,最可恶的是异步函数都是Void类型,得不到返回结果,虽然有Completed的事件处理,但是还是感觉比较束缚,无法与前端交互. 这里就跟大家分享一种传入回调函数的方法,把前台的方法写好,传到后台,让异步方法调用完成时执行.废话不多说了,开始写代码: 首先,要先建一个带网站的sliverlight项目,这里就不细说了,在网站中添加

C# 委托的三种调用示例(同步调用 异步调用 异步回调)

本文将主要通过同步调用.异步调用.异步回调三个示例来讲解在用委托执行同一个加法类的时候的的区别和利弊 首先,通过代码定义一个委托和下面三个示例将要调用的方法: public delegate int AddHandler(int a,int b); public class 加法类 { public static int Add(int a, int b) { Console.WriteLine("开始计算:" + a + "+" + b); Thread.Slee

浅谈委托,事件,异步调用,回调等概率

直接说题. 委托         首先明确它是什么,其实就是一个类,定义一个委托即定义一个类,那么它是什么类?用来说明方法的类型的类.字段有类型,那么方法其实也有类型,就是委托.       委托是某一类方法的总定义.    事件           事件是某个类用于传递消息的方式.事件之余委托,犹如属性之余变量即是委托的封装.     好了,明确了概念,接下来说示例.    示例         有3个对象  鼠标,button,winform .鼠标点击button对象,触发button的c

C#委托调用(同步调用,异步调用,异步回调)

#region 委托回调 static void delegateTest() { Console.WriteLine("同步调用"); SubDelegate subDel = Sub; var result = subDel.Invoke(3, 4); Console.WriteLine("继续"); Console.WriteLine(result); Console.ReadKey(); Console.WriteLine("异步调用")

C# 同步调用 异步调用 异步回调 多线程的作用

同步调用   : 委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. 异步调用  :同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕的用户体验,这时候异步调用就很有必要了.异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程可以继续执行.委托的异步调用通过BeginInvoke和EndInvoke来实现. 异步回调函数  :当异步调用时,主线程并没有等待,而是