zoukankan      html  css  js  c++  java
  • java 回调的原理与实现

    回调函数,顾名思义,用于回调的函数。回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数。回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机。

    回调原本应该是一个非常简单的概念,但是可能因为平时只用系统为我们写好的回调的接口了,自己很少实现回调,所以在自己实现回调的时候还是有一点点晕的,现在写这篇文章记录一下,也和大家分享一下怎么写回调接口。

    回调

    回调的概念:举个例子就是,我们想要问别人一道题,我们把题跟对方说了一下,对方说好,等我做完这道题,我就告诉你,这个时候就用到了回调,因为我们并不知道对方什么时候会做完,而是对方做完了来主动找我们。

    同步回调

    代码运行到某一个位置的时候,如果遇到了需要回调的代码,会在这里等待,等待回调结果返回后再继续执行。

    异步回调

    代码执行到需要回调的代码的时候,并不会停下来,而是继续执行,当然可能过一会回调的结果会返回回来。

    总体的代码还是很简单的,就是模拟了一个打印机,还有一个人,打印机具有打印的功能,但是打印需要时间,不能在收到任务的同时给出反馈,需要等待一段时间才能给出反馈。
    这个人想做的就是打印一份简历,然后知道打印的结果。这里面代码实现了这两种方式。

    具体代码:
    Callback.java

    public interface Callback {
    	void printFinished(String msg);
    }
    

    Printer.java

    public class Printer {
    	public void print(Callback callback) {
    		System.out.println("正在打印 . . . ");
    		try {
    			Thread.currentThread();
    			Thread.sleep(3000);// 毫秒
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		callback.printFinished("打印完成");
    	}
    }
    

    People.java

    public class People {
    
    	Printer printer = new Printer();
    
    	/*
    	 * 同步回调
    	 */
    	public void goToPrintSyn(Callback callback) {
    		printer.print(callback);
    	}
    
    	/*
    	 * 异步回调
    	 */
    	public void goToPrintASyn(Callback callback) {
    		new Thread(new Runnable() {
    			public void run() {
    				printer.print(callback);
    			}
    		}).start();
    	}
    }
    

    Main.java 测试类,同步回调

    public class Main {// 测试类,同步回调
    	public static void main(String[] args) {
    		People people = new People();
    		Callback callback = new Callback() {
    			@Override
    			public void printFinished(String msg) {
    				System.out.println("打印机告诉我的消息是 ---> " + msg);
    			}
    		};
    		
    		System.out.println("需要打印的内容是 ---> " + "打印一份简历");
    		people.goToPrintSyn(callback);
    		System.out.println("我在等待 打印机 给我反馈");
    	}
    }
    
    需要打印的内容是 ---> 打印一份简历
    正在打印 . . . 
    打印机告诉我的消息是 ---> 打印完成
    我在等待 打印机 给我反馈
    

    Main.java 测试类,异步回调

    public class Main {// 测试类,异步回调
    	public static void main(String[] args) {
    		People people = new People();
    		Callback callback = new Callback() {
    			@Override
    			public void printFinished(String msg) {
    				System.out.println("打印机告诉我的消息是 ---> " + msg);
    			}
    		};
    		
    		System.out.println("需要打印的内容是 ---> " + "打印一份简历");
    		people.goToPrintASyn(callback);
    		System.out.println("我在等待 打印机 给我反馈");
    	}
    }
    
    需要打印的内容是 ---> 打印一份简历
    我在等待 打印机 给我反馈
    正在打印 . . . 
    打印机告诉我的消息是 ---> 打印完成
    
  • 相关阅读:
    Struts 2
    spring中的发布订阅
    win10 安装mysql5.7.36
    Spring Boot如何使用HikariCP连接池详解
    ascii 和 byte以及UTF-8的转码规则
    计算机基础之 二进制与十进制
    VMWare VMNet 8 的配置使用
    IDEA中运行kotlin程序报错:Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6
    在Kotlin中使用Kotlin/java注解及注意事项
    关于Vue2.0,Express实现的简单跨域
  • 原文地址:https://www.cnblogs.com/gmhappy/p/11864006.html
Copyright © 2011-2022 走看看