java回调

什么是回调:
      有一个接口:callback,接口中有一个尚未实现的方法c,类A实现了这个接口。A含有一个类B的引用,同样类B包含着一个接口callBack的引用。类A在调用类Binvoke方法的时候,类b通过callBack的引用也调用了类A实现的c方法。
       java回调_第1张图片
下面以示例代码进行说明:
 
public interface callback {
public void solve(String ans);
}
public class li implements callback{
	private wang w;

	public wang getW() {
		return w;
	}
	public void setW(wang w) {
		this.w = w;
	}
	@Override
	public void solve(String ans) {
		System.out.println("告诉我的答案是:"+ans);
		
	}
	public void askQuestion(final String question)
	{
		System.out.println("询问的问题是...."+question);
		this.w.setC(this);
		new Thread(new Runnable(){

			@Override
			public void run() {
			w.execute( question);
				
			}
			
		}).start();
		this.play();
		
	}
	public void play()
	{
		int i=0;
		while(i<20)
		{
			try {
				Thread.sleep(40);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			i++;
		  System.out.println("我在玩....");
		}
	}
	public static void main(String[] args) {
		/*下面对代码进行测试*/
		li l=new li();
		wang w=new wang();
		l.setW(w);
		l.askQuestion("1+1等于几");
	}

}
public class wang {
private callback c;
public callback getC() {
	return c;
}
public void setC(callback c) {
	this.c = c;
}
public void execute(String q)
{
	System.out.println("小王在思考的问题...");
	try {
		Thread.sleep(500);//模拟思考问题
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	String ans="2";
	c.solve(ans);
}
}



例子:小李(类li=类A)需要向小王(类wang=类B),打电话问一个问题(askQuestion=doSomeThing),这个问题比较困难,小王得想一会才能回答,小李问完后不可能一直等着小王回复,问完问题后他就跟小王说,我先去玩了(play),等你想出问题的答案后打电话告诉我。这时候小李在玩的过程中,小王想出了问题的答案,给小李打电话,告诉了小李答案。
因此:你打电话给你同学就是【you call me】,你同学解决完之后打电话给你就是【i call you back】。 
为什么要使用回调函数
  因为可以把调用者与被调用者分开。调用者啊(类B)不关心谁是被调用者(类A),所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int方法)的被调用的接口(callBack)。
  如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库,它提供了某些排序算法的实现,如冒泡排序、快速排序、shell排序、shake排序等等,但为使库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调,回调可用于异步通知机制。

你可能感兴趣的:(java回调)