欢迎来到知了汇智!
联系电话:知了汇智-电话号码 028-62016472 / 13228113191

分享java回调机制用的理解与实例-知了汇智

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

  场景如下:

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

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

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

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

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

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

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

 

  先介绍什么是回调:

  就是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=");
    }


  版权声明:本文来源于网络,由知了堂搜集整理,仅供大家学习Java时使用

项目教学·项目驱动

132 2811 3191
预约免费试学
点击咨询
预约试学