java回调机制用的理解与实例

生活场景如下:

Wang写数学题,有一道比较难,需要问Li,Li也不会,要先回家一趟问问老爸怎么做,这个时候有wang如下三种选择:

1)一直等待Li回来,期间啥也不干同步方式

2) 等等再过来看Li回来没,异步future方式

3)wang把电话留下来,让LI回来时打电话给自己异步callback方式

其中联系方式 就是回调函数,也就是其他人在完成任务后会调用的函数

而留下联系方式的过程称为登记回调函数,也就是要其他人帮自己去做某件事.

先介绍什么是回调:

就是A类中调用B类中的某个方法C,然后B类在方法c中反过来调用A类中的方法D,D这个方法就叫回调方法。

Class A实现接口CallBack——要求1

class A中包含一个class B的引用b ——要求2

class B有一个包含参数CallBack的方法c(CallBack callback) ——要求3

A的对象a调用B的方法 c(CallBack callback) ——A类调用B类的某个方法 C,同时将a作为参数传给方法c

然后b就可以在c(CallBack callback)方法中调用A的方法d ——B类调用A类的某个方法D

回调接口:

public interface CallBack {
    void solveProblem(String question,String  answer);
}

wang-->类A

public class Wang implements CallBack{

    Li li;

    public Wang(Li li){
        this.li=li;
    }

    // 主线程不关心异步执行的结果
    public void askQuestion(String  question)  {
        System.out.println("wnag:li,"+question);

        // Runnable异步方式,不等待,不关心返回值
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 注意,这里吧wang.this也传了过去
                li.solveAnswer(question,Wang.this);
            }
        }).start();

        System.out.println("wang:我逛街了");

    }

    // 主线程关心异步执行的结果
    public void askQuestion2(String  question) throws ExecutionException, InterruptedException {
        System.out.println("wnag:li,"+question);

        // Callable异步方式,不等待
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        FutureTask futureTask = new FutureTask(new Callable() {
            @Override
            public Object call() {
                li.solveAnswer(question, Wang.this);
                return null;
            }
        });
        Future<?> future = executorService.submit(futureTask);

        System.out.println("wang:我逛街了");
        // 对异步回调返回的结果继续处理
        Object o1 = future.get();
        System.out.println("wang:根据异步结果继续干活");
    }

    @Override
    public void solveProblem(String question,String answer) {
        System.out.println("wang:"+question+"答案是:"+answer);
    }

}

对wang需要说明的是,askQuestion和askQuestion2两种实现方式的区别,虽然都是异步的,但是主线程对异步执行的结果处理不同,askQuestion2中可以获取对应返回类并进行处理。

Li--->类B

public class Li {

    public void solveAnswer(String question, CallBack callBack){
        // 为了展示异步效果,所以故意进行延迟
        for(int i=0;i<10000000;i++){

        }
        System.out.println("li: do myself thing");


        String  answer = "";
        if("1+1=".equals(question)){
            answer="2";
        }else{
            answer="no answer";
        }

        System.out.println("li: get answer"+answer);
        callBack.solveProblem(question,answer);
    }
}

调用代码:

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Li li = new Li();
        Wang wang = new Wang(li);
//        wang.askQuestion("1+1=");
        wang.askQuestion2("1+1=");
    }

参考文章:

https://blog.csdn.net/xiaanming/article/details/8703708

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值