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,老师类

packagecom.xhqb.market.biz.service.impl;public class TeacherYang implementsCSCallback {privateStudentHe studentHe;publicTeacherYang(StudentHe studentHe){this.studentHe =studentHe;

}

//回调:双向调用//类TeacherYang中的方法shuaQiang(),里面调用了类StudentHe里面的getHouseLocation()方法//而类StudentHe里面的getHouseLocation()方法也调用了callback的process()方法//而类TeacherYang实现了callback接口,这就体现了回调。同时,另起线程,实现异步 //这里String houseLocation 用final修饰是因为houseLocation要放到子线程中用,而子线程要求的变量或对象要么是fianl的,要么是全局的,防止随意修改

public void shuaQiang(finalString houseLocation){

System.out.println("杨老师发给何同学要刷的墙屋位置,位置是:" +houseLocation);new Thread(newRunnable() {

@Overridepublic voidrun() {

studentHe.getHouseLocation(TeacherYang.this,houseLocation);

}

}).start();

System.out.println("何同学已经收到老师发送的位置,准备开刷!");

}

@Overridepublic voidprocess(String result) {try{

Thread.sleep(5*1000);

}catch(InterruptedException e){

e.printStackTrace();

}

System.out.println("杨老师在家喝茶...收到何同学发来的信息:" + result + ",杨老师满足的笑了,心想:又省了好些钱...");

}

@Overridepublic voiddoIt(String status) {

}

}

3,学生类

public classStudentHe {public voidgetHouseLocation(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 classCallBackTest {public static voidmain(String[] args) {

StudentHe studentHe= newStudentHe();

TeacherYang teacherYang= newTeacherYang(studentHe);

teacherYang.shuaQiang("湖南大学家属院");

}

}

5,结果

杨老师发给何同学要刷的墙屋位置,位置是:湖南大学家属院

何同学已经收到老师发送的位置,位置是:湖南大学家属院----->开始工作了!

何同学已经收到老师发送的位置,准备开刷!

刷了3个小时,累的跟条狗一样,何同学终于刷完了!

杨老师在家喝茶...收到何同学发来的信息:'老师墙刷完了,可以住了!',杨老师满足的笑了,心想:又省了好些钱...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值