Java回调函数解析

引用1:https://kt8668.iteye.com/blog/205739

引用2:https://hellosure.iteye.com/blog/1130176

引用3:https://blog.csdn.net/xiaanming/article/details/8703708

在学习Spring Boot时候,看到了回调函数,以前学习过的现在又忘记了,想着这次学习然后记录下来,以备以后复习。

调用方式

在软件中,各个模块之间需要互相调用,调用方式有同步调用与异步调用。

同步调用

class A中方法methodA需要调用class B中的方法methodB,在同步调用时,class A中的方法methodA方法必须等到class B中的methodB方法执行完毕以后才能继续执行后面的语句,这会存在一个问题,如果methodB中方法执行时间需要很长,那么methodA需要一直等待,这显然很浪费时间。在实际工作中,你的老板吩咐你任务以后,显然不会等你完成以后再做别的工作,而是分配你任务以后,自己再去做别的事情,员工完成任务以后,主动去找老板汇报,这就是异步调用。

异步调用

异步调用指class A中方法methodA需要调用class B中的方法methodB时,可以新开一个线程,等待class B中的methodB中的方法执行任务,class A中的methodA方法可以继续执行后面的语句。这同样会存在一个问题,methodB方法执行完毕以后,class A中的methodA方法如何知道其已经执行完毕了?这就涉及到Java中的回调机制。

回调

回调有一句很fashion的话语,就像Spring中的好莱坞原则(Don't call me, I will call you),If you call me,I will call you back.在class A中methodA方法调用了classB中的方法methodB方法后,当methodB方法执行完毕以后,会自动调用classA中的方法,告知我已经执行完毕了。

例子

这里的例子很多,我这里就举一个老板与员工的例子。老板有一个任务需要分配给某一个员工去完成,当员工完成以后,员工告知老板(可以打老板的电话)任务已经完成。

1.回调函数接口

package com.honorzhang.callback;

public interface Callback {
	
	//相当于是电话
	public void finishedJob(String msg);

}

2.老板

package com.honorzhang.callback;

public class Boss implements Callback{
	private Staff staff;
	
	public Boss(Staff staff) {
		this.staff = staff;
	}
	
	public void distributeTask() throws InterruptedException {
		//新开一个线程,让员工去执行任务
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				
				staff.solveProblem(Boss.this);
				System.out.println(Thread.currentThread().getName());
				
			}
		}).start();
		
		/*
		 * 接下来的三行代码主要是为了更好的看到代码执行的顺序情况
		 */
		System.out.println(Thread.currentThread().getName());
		//sleep的时间可以自己设定,从而更好的理解代码的顺序执行情况
		Thread.sleep(5000);
		System.out.println("***我是分配任务后的老板要做的工作***");
	}

	@Override
	//告知员工电话号码,任务完成以后,可以打这个电话号码告知任务完成
	public void finishedJob(String msg) {
		System.out.println(msg);
		
	}

}

3.员工

package com.honorzhang.callback;

public class Staff {
	
	public void solveProblem(Callback callback) {
		
		//模拟员工解决问题
		try {
			System.out.println("正在解决问题...");
			Thread.sleep(3000);
		} catch (Exception e) {
			System.out.println(e);
		}
		
		callback.finishedJob("报告老板,问题已经解决");
		
	}

}

4.测试程序

package com.honorzhang.callback;

public class CallbackTest {

	public static void main(String[] args) throws InterruptedException {
		Staff staff = new Staff();
		Boss boss = new Boss(staff);
		
		boss.distributeTask();

	}

}

5.执行结果

   1.Boss代码块sleep时间设置为2s,执行结果如下:

  2.Boss代码块sleep时间设置为5s,执行结果如下:

以上是我对Java回调函数的理解,有不对的地方还请多多指教。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值