同步回调与异步回调的实现与学习

这段时间学习java的回调机制,在网上包括博客寻找了许多关于回调的一些文章和文献,最终自己尝试着理解和写了一些回调的实现用作学习理解,话不多说,直接上主菜。(本人新人入坑,只是阐述了自己的理解与实现,欢迎大家交流批评~)

回调我这里说两种,一个是同步回调,一个是异步回调。(文章最后有图解,听说代码和图片在一起更配哦~)


同步回调(代码是写给有恒心之人)

这里我先把同步回调代码贴出来

情景;小明和小芳在聊天,小明问小芳在做什么,小芳马上回答了后,小明便说收到了

这里先定义了一个接口

public interface CallBackInterface {
	 public void execute();  
}

然后实现小明的类,他实现了上面的接口。

public class XiaoMing implements CallBackInterface{
	
	public XiaoMing(){
		System.out.println("小芳在做啥?");
	}
     
    public void execute() {  
        System.out.println("收到了!!" );  
        
          
    }  
}

然后定义小芳的类

public class XiaoFang {

	private CallBackInterface callback;
	
	public XiaoFang(){
		
	}
	
	public XiaoFang(CallBackInterface callback){
		this.callback = callback;
	}
	

	
	   
    public void doSome(){  
        
            System.out.println("我刚才去洗碗了!");  
         
        //I can call you back
        callback.execute();  
    }  
}
最后便是做场景的main方法啦

public class MainC {

	public static void main(String[] args){
		
		System.out.println("单线程同步回调");
		
		
		XiaoMing xiaoming = new XiaoMing();
		
	
		XiaoFang x2 = new XiaoFang(xiaoming);
		

		x2.doSome();
	
	}
}
运行结果;

单线程同步回调
小芳在做啥?
我刚才去洗碗了!
收到了!!

让我们来捋一捋思路,小明的实现的callback接口就像是一个可供回话的电话号码,小明在主方法中先实例化了自己(问小芳在做啥),并在其中留下了一个回话的方法(当然小明是不可能知道小芳会讲什么的 )。然后小芳实例化了自己,并把小明的问题和回话方法拿到并做出了回应(“我刚才去洗碗了”),然后打电话(callback.execute()),小明这时便收到了消息(我收到了)。这个例子中不难看到回调的身影,小明a->小芳b->小明a的回答。


再来看看异步回调。

情景;小明问小芳在做啥,然后小明便出门了,小明留下了一台可供收消息的留言机,小芳过了一会才收到消息并回复。

上代码

还是先定义一个callback接口

public interface CallBack {

	public void result();
}
然后是小明的方法

public class XiaoMing implements CallBack{
	
	public XiaoMing(){
		System.out.println("小芳在做啥?");
	}

	public void result() {
		System.out.println("小明回答;收到!");
	}

}

小芳

public class XiaoFang implements Runnable{  
      
    public CallBack callback;  
      
    public XiaoFang (CallBack callback){                                                                                                  
        this.callback = callback;  
    }  
  
    public void run() {  
          
        try {  
            Thread.sleep(3000);  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
 	System.out.println("过了两秒小芳才回答");   
	System.out.println("我去喝奶茶了");         
 	callback.result();                              
              } 
}  

然后便是主场景MainA

public class MainA {

	
	public static void main(String[] args){
		
		XiaoMing x = new XiaoMing();
		
		XiaoFang xiaofang = new XiaoFang(x);
		
		new Thread(xiaofang).start();
		
		System.out.println("小明问完就出门买东西了");
		
	}
	
}

运行结果;

小芳在做啥?
小明问完就出门买东西了
过了两秒小芳才回答
我去喝奶茶了
小明回答;收到!

     可以看到,异步回调与同步回调并没有太大的区别,唯一的区别便是小芳这次没有马上回答,而是等了一会才回了消息(新开线程),但是回调的实现还是基本一模一样的,还是小明a->小芳b(等待后)->小明a的回答。

    当然了,多线程回调的实际开发我觉得可能更多用在网络请求中。

最后,不多解释,上图!


       


    没错这就是回调的流程图解,

1,首先两个对象都实现了callback接口,对象A(小明)在他其中实现了callback具体要做的事 ;

2,然后对象B(小芳),会取得对象A(小明的)传入的callback,也就是this.callback = callback ;

3,这时,对象B(小芳)执行的便是对象A(小明)实现的接口callback的方法啦(“收到了”)!

    是不是很眼熟,对了你想的没错,就是android的点击事件,我们平时写的匿名onclicklistener就是我们的小明,而小芳就是我们用的控件(你可以在button源码里发现this.onclicklisten = onclicklisten ~ . ~)。具体的实际运用大家就自己去研究拉~(如果你觉得这篇文章值得一读,那希望读者大人们能为作者点个赞哦~)










评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值