JAVA回调机制
Posted 顧棟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA回调机制相关的知识,希望对你有一定的参考价值。
JAVA回调
当在A中调用B,B在完成后,又调用A的某个方法,此方法就是A的回调方法,B调用A的方式叫回调。
结合java概念进行解释,主要需要实现JDK的CallBack类
- class A实现接口CallBack callback
- class A中包含一个class B的引用b
- class B有一个参数为callback的方法f(CallBack callback)
- A的对象a调用B的方法 f(CallBack callback)
- 然后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回调机制的主要内容,如果未能解决你的问题,请参考以下文章