码迷,mamicode.com
首页 > 编程语言 > 详细

java回调

时间:2018-06-18 15:11:05      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:nts   err   过程   back   直接   str   test   有一个   例子   

什么是回调
(1) 概念
回调发生在两个类中,即A类方法a()调用了B的方法b(),然后B为了将完成的结果result主动回调给A而调用其回调方法 callback(),这是一种双向的调用方式。如boss很忙要员工将这周的手机销量整理出来报告给他,然后员工将统计结果主动反馈给boss。
 
(2) 分类
同步回调:代码运行到回调代码处,就会等待执行结果,当结果返回后继续执行后面的逻辑。因同步调用有一个停下来等待过程,所以回调代码处的函数执行时间不能太长,如果太长可能导致阻塞,也就是后面的逻辑无法执行,从而导致整个流程卡住。
异步回调:是为了弥补同步回调可能引起阻塞的缺陷,而产生一种新的调用方式。其实异步回调就是在A类中a()方法处开启线程的方式调用B类中b()方法,后面的代码逻辑直接往下执行,这时b()方法执行时间长短都不会引起方法a()阻塞了。
 
模拟场景代码
写一个异步回调的例子:boss让员工统计手机销量数据,完成后反馈给boss。
定义一个回调接口,用于员工向boss反馈查询结果:
1 package com.jsnh.callback;
2 
3 /**
4  * 回调接口
5  *
6  */
7 public interface CallbackStatistics {
8     public void Sales_Statistics(int number);
9 }

结果反馈给boss,在boss对象中实现CallbackStatistics 接口:

 1 /**
 2  * Boss对象
 3  */
 4 public class Boss implements CallbackStatistics{
 5 
 6     private Staff staff;
 7     
 8     public Boss(Staff staff) {
 9         this.staff = staff;
10     }
11     
12     public void askStatistics() {
13         new Thread(new Runnable() {
14             
15             @Override
16             public void run() {
17                 staff.queryStaStatistics(Boss.this);                
18             }
19         }).start();
20         System.out.println("异步回调处理完成");
21     }
22     
23     @Override
24     public void Sales_Statistics(int number) {
25         System.out.println("Lisan你反馈给我的统计是:" + number );
26     }
27 }
askStatistics()相当于分派给员工的任务,开启一个线程实现异步回调;Sales_Statistics(int number)员工反馈给boss结果后,boss要做的事情。
  定义一个完成任务的接口,即员工接口,传入的参数CallbackStatistics是为了让具体执行任务的员工向谁反馈结果:
1 /**
2  * 员工接口
3  */
4 public interface Staff {
5 
6     public void queryStaStatistics(CallbackStatistics callbackStatistics);
7 
8 }

定义一个具体员工实现类:

 1 /**
 2  * Lisan完成了boss的工作任务
 3  */
 4 public class Lisan implements Staff{
 5 
 6     @Override
 7     public void queryStaStatistics(CallbackStatistics callbackStatistics) {
 8         //模拟查询
 9         int phoneCount = 0;
10         try {
11             Thread.sleep(5000);
12             phoneCount = 10000;
13         } catch (InterruptedException e) {
14             e.printStackTrace();
15         }
16         //向boss报告查询结果
17         callbackStatistics.Sales_Statistics(phoneCount);
18     }
19 }

测试类,验证结果:

 1 /**
 2  * 回调测试类
 3  */
 4 public class CallbackStatisticsTest {
 5 
 6     public static void main(String[] args) {
 7         Staff staff = new Lisan();
 8         Boss boss = new Boss(staff);
 9         boss.askStatistics();
10     }
11 
12 }

运行结果:

异步回调处理完成
Lisan你反馈给我的统计是:10000

 参考:https://www.cnblogs.com/xrq730/p/6424471.html

 

 

java回调

标签:nts   err   过程   back   直接   str   test   有一个   例子   

原文地址:https://www.cnblogs.com/jsnhdream/p/9195092.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!