JAVA回调机制

Posted 顧棟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA回调机制相关的知识,希望对你有一定的参考价值。

JAVA回调

当在A中调用B,B在完成后,又调用A的某个方法,此方法就是A的回调方法,B调用A的方式叫回调。

结合java概念进行解释,主要需要实现JDK的CallBack类

  1. class A实现接口CallBack callback
  2. class A中包含一个class B的引用b
  3. class B有一个参数为callback的方法f(CallBack callback)
  4. A的对象a调用B的方法 f(CallBack callback)
  5. 然后b就可以在f(CallBack callback)方法中调用A的方法

回调分为同步回调和异步回调。

同步回调

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

异步回调

代码执行到需要回调的代码的时候,线程并不会阻塞,而是继续执行,当然可能回调的结果会返回回来。

实现

内部类方式

/**
 * 回调接口
 */
public interface Callback 
    public void callback1();

    public void callback2();

/**
 * 拥有回调方法的类
 */
public class ClassA 
    public static ACallback ac;

    /**
     * 普通方法
     */
    public void method1() 
        System.out.println("ClassA.method1");
    

    /**
     * 同步回调
     */
    public void syncCallmethod() 
        System.out.println("ClassA.syncCallmethod >>>>>>");
        ClassB b = new ClassB();
        ac = new ACallback();
        b.method1(ac);
        System.out.println("ClassA.syncCallmethod <<<<<<");
    

    /**
     * 异步回调
     */
    public void asyncCallmethod() 
        new Thread(() -> 
            System.out.println("ClassA.asyncCallmethod >>>>>>");
            ClassB b = new ClassB();
            ac = new ACallback();
            b.method1(ac);
            System.out.println("ClassA.asyncCallmethod <<<<<<");
        ).start();
    

    /**
     * 静态内部类实现回调
     */
    public static class ACallback implements Callback 

        @Override
        public void callback1() 
            System.out.println("ClassA.ACallback.callback1");
        

        @Override
        public void callback2() 
            System.out.println("ClassA.ACallback.callback2");
        
    

/**
 * 拥有调用其他类回调方法的类
 */
public class ClassB 
    /**
     * method1在最后执行了参数callback的回调方法callback1
     *
     * @param callback 回调对象
     */
    public void method1(Callback callback) 
        System.out.println("ClassB.method1 is start");
        try 
            Thread.sleep(3000);
         catch (Exception e) 
            e.printStackTrace();
        
        System.out.println("ClassB.method1 is done");
        callback.callback1();
    

/**
 * 测试类
 */
public class Client 
    public static void main(String[] args) 
        asyncCall();
        syncCall();
    

    /**
     * 异步回调
     * 不等回调直接执行method1
     */
    public static void asyncCall() 
        ClassA a = new ClassA();
        a.asyncCallmethod();
        a.method1();
    

    /**
     * 同步回调
     * 等待回调后在执行method1
     */
    public static void syncCall() 
        ClassA a = new ClassA();
        a.syncCallmethod();
        a.method1();
    

异步回调执行结果

ClassA.method1
ClassA.asyncCallmethod >>>>>>
ClassB.method1 is start
ClassB.method1 is done
ClassA.ACallback.callback1
ClassA.asyncCallmethod <<<<<<

同步回调执行结果

ClassA.syncCallmethod >>>>>>
ClassB.method1 is start
ClassB.method1 is done
ClassA.ACallback.callback1
ClassA.syncCallmethod <<<<<<
ClassA.method1

用Listener来实现

/**
 * 事件监听器,事件处理器 
 */
public interface EventListener 
	void onclickButton();

/**
 * 事件源:事件发生的地点 
 */
public class EventSource 
	private EventListener eventListener;

	// 注册监听器
	public void setEventListener(EventListener listener) 
		this.eventListener = listener;
	
	
	// 触发事件
	public void eventHappened() 
		this.mEventListener.onclickButton();
	

public class EventTest 
	public static void main(String[] args) 
		// 事件源(被监听的对象)
		EventSource eventSource = new EventSource();
		
		// 监听器(实现接口方法)
		EventListener eventListener = new EventListener() 
			@Override
			public void onclickButton() 
				// TODO Auto-generated method stub
				System.out.println("You click button");
			
		;
		
		// 注册监听器到事件源 
		eventSource.setEventListener(eventListener);
		eventSource.eventHappened();
	

事件源中注册事件监听器,通过事件触发了事件源中对监听器的回调

以上是关于JAVA回调机制的主要内容,如果未能解决你的问题,请参考以下文章

JAVA回调机制解析

java回调机制

Java 消息机制之回调详解

Java 回调机制的理解

Java回调机制

JAVA回调机制