zoukankan      html  css  js  c++  java
  • java 异步回调 详解

    异步回调:一种类似消息或事件的机制,被调用方在函数在收到某种讯息或发生某种事件时,才去调用对方的函数,即通过异步消息进行通知。简单来说,类A的a()函数调用类B的b()函数,但是b()函数很耗时,不确定什么时候执行完毕,如果是同步调用的话会等b()执行完成后才往下执行回调类A中的函数,如果是异步回调的话调用了b()函数,虽然b()函数没有执行完,但仍然继续往下执行,为了完成这点,就需要另开一个线程了

    CallBack接口里面的方法是回调函数(方法)

    杨老师要粉刷墙壁,但是又不想请人工,所以叫上她的学生去帮她粉刷 叫学生拿着钥匙去刷墙,刷完之后告诉她结果

    1,老师与学生之间的联系方式:callback接口

    2,老师必须实现callback接口,这样,学生才能通过这个联系方式找到老师

    3,老师要拿到学生的引用,这样就可以帮学生注册回调接口

    4,学生必须知道联系方式,也就是必须传入callback接口作为入参,另外,还必须知道老师安排的任务是什么,所以任务也作为入参

    来人哪~上代码!

    嗻~~~~~

    1,callback接口

    public interface Callback {
         void process(String result);
    }
    

    2,老师类

    
    
    package com.xhqb.market.biz.service.impl;
    
    public class TeacherYang implements CSCallback {
    
        private StudentHe studentHe;
    
        public TeacherYang(StudentHe studentHe){
            this.studentHe = studentHe;
        }
    
    
    //回调:双向调用
    //类TeacherYang中的方法shuaQiang(),里面调用了类StudentHe里面的getHouseLocation()方法 //而类StudentHe里面的getHouseLocation()方法也调用了callback的process()方法 //而类TeacherYang实现了callback接口,这就体现了回调。同时,另起线程,实现异步
    //这里String houseLocation 用final修饰是因为houseLocation要放到子线程中用,而子线程要求的变量或对象要么是fianl的,要么是全局的,防止随意修改 public void shuaQiang(final String houseLocation){ System.out.println("杨老师发给何同学要刷的墙屋位置,位置是:" + houseLocation); new Thread(new Runnable() { @Override public void run() {
    studentHe.getHouseLocation(TeacherYang.
    this,houseLocation); } }).start(); System.out.println("何同学已经收到老师发送的位置,准备开刷!"); } @Override public void process(String result) { try{ Thread.sleep(5*1000); }catch (InterruptedException e){ e.printStackTrace(); } System.out.println("杨老师在家喝茶...收到何同学发来的信息:" + result + ",杨老师满足的笑了,心想:又省了好些钱..."); } @Override public void doIt(String status) { } }
    
    
    
     

    3,学生类

    public class StudentHe {
    
        public void getHouseLocation(Callback callback,String houseLocation){
           System.out.println("何同学已经收到老师发送的位置,位置是:" + houseLocation + "----->开始工作了!");
    
           try{
               Thread.sleep(10*1000);
           }catch (InterruptedException e){
               e.printStackTrace();
           }
           System.out.println("刷了3个小时,累的跟条狗一样,何同学终于刷完了!");
           String status = "'老师墙刷完了,可以住了!'";
           callback.process(status);
        }
    
    }

    4,测试类

    public class CallBackTest {
        public static void main(String[] args) {
            StudentHe studentHe = new StudentHe();
            TeacherYang teacherYang = new TeacherYang(studentHe);
            teacherYang.shuaQiang("湖南大学家属院");
        }
    }

    5,结果

    杨老师发给何同学要刷的墙屋位置,位置是:湖南大学家属院
    何同学已经收到老师发送的位置,位置是:湖南大学家属院----->开始工作了!
    何同学已经收到老师发送的位置,准备开刷!
    刷了3个小时,累的跟条狗一样,何同学终于刷完了!
    杨老师在家喝茶...收到何同学发来的信息:'老师墙刷完了,可以住了!',杨老师满足的笑了,心想:又省了好些钱...
  • 相关阅读:
    OGG复制同步,提示字段长度不够ORA-01704
    19c修改system,sys密码
    NFS服务端与客户端断网,导致作为NFS客户端的Oracle主机hang住
    ACFS启动报错acfsload start line 42: /lib/acfstoolsdriver.sh: No such file or directory
    OGG MAXTRANSOPS 参数
    TCP详解
    异步机制
    Linux 下创建和使用静态库
    U3D简单得换装技术
    排序
  • 原文地址:https://www.cnblogs.com/mmh760/p/10950325.html
Copyright © 2011-2022 走看看