zoukankan      html  css  js  c++  java
  • java回调

    什么是回调
    (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

     
  • 相关阅读:
    MySQL数据库优化详解(收藏)
    怎么设置Linux swap分区?方法教程
    js获取IP地址多种方法实例教程
    JQuery设置获取下拉菜单选项的值 多实例
    JQuery中serialize()、serializeArray()和param()用法举例
    javascript 获取函数形参个数
    mysql SQLyog导入csv数据失败怎么办?
    今天离职了!
    Asp.Net Core 使用Quartz基于界面画接口管理做定时任务
    Asp.Net Core中使用Swagger,你不得不踩的坑
  • 原文地址:https://www.cnblogs.com/jsnhdream/p/9195092.html
Copyright © 2011-2022 走看看