java异步回调讲解

所谓回调:就是A类中调用B类中的某个方法M1,然后B类中反过来调用A类中的方法M2,M2这个方法就叫回调方法。实际在使用的时候,也会有不同的回调形式,这里主要讲一下异步回调形式。

  • Class A实现接口CallBack callback——背景1
  • class A中包含一个class B的引用b ——背景2
  • class B有一个参数为callback的方法m(CallBack callback) ——背景3
  • A的对象a调用B的方法 m(CallBack callback) ——A类调用B类的某个方法M1
  • 然后b就可以在m(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法M2

举个列子:

小梁GG和小祝MM在同一家公司上班,今天是情人节,小梁GG晚上下班想请小祝MM一起吃饭,但是小祝MM手头上还有很多事情没有忙完,如果下班之前不能弄完,晚上就要加班了,就没有时间了,她需要到下班的时候才能回复。到了快下班的时候,小祝MM手头上的事情完成了,晚上不用加班了,就马上给小梁GG打电话告诉他晚上可以一起吃饭了。

package com.cmh.mq.thread.AsynCallback;

/**
 * 这是回调接口
 * 
 * @author CMH
 *
 * @param <T>
 */
public interface CallBack{

	void reply(String message);
}

package com.cmh.mq.thread.AsynCallback;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 这是小梁GG
 * 
 * @author CMH
 *
 */
public class Liang implements CallBack {

	private static Log logger = LogFactory.getLog(Liang.class);

	/**
	 * 小祝MM
	 */
	private Zhu zhu;

	public Liang(Zhu zhu) {
		super();
		this.zhu = zhu;
	}

	/**
	 * 小梁GG邀约小祝MM晚上一起吃饭
	 * 
	 * @param invitation
	 */
	public void invite(final String invitation) {

		logger.info("小梁GG正在给小祝MM打电话邀请她晚上一起吃饭");
		// 线程(异步)
		new Thread(new Runnable() {

			@Override
			public void run() {
				/**
				 * Liang调用Zhu的方法
				 */
				zhu.excuteMessage(Liang.this, invitation);
			}
		}).start();
		logger.info("小梁GG已经邀请完成,等待小祝最后回复");

		// 约完之后,小梁GG继续上班
		play();

	}

	private void play() {
		System.out.println("小梁GG继续上班");
	}

	@Override
	public void reply(String message) {
		System.out.println("来自小祝MM的回复:" + message);
	}

}

package com.cmh.mq.thread.AsynCallback;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 这是小祝MM
 * 
 * @author CMH
 *
 */
public class Zhu {

	private static Log logger = LogFactory.getLog(Zhu.class);

	public void excuteMessage(CallBack callBack, String message) {
		logger.info("来自小梁GG的邀约:" + message);

		// 模拟小祝MM办自己的事情
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		// 打电话告诉小梁GG
		callBack.reply("小祝晚上有时间");
	}

}


测试类

package com.cmh.mq.thread.test;

import org.junit.Test;

import com.cmh.mq.thread.AsynCallback.Liang;
import com.cmh.mq.thread.AsynCallback.Zhu;

/**
 * 测试类
 * 
 * @author CMH
 *
 */
public class AsynCallBackTest {

	@Test
	public void callBackTest() {

		// 创建一个小祝MM
		Zhu zhu = new Zhu();

		// 创建一个小梁GG
		Liang liang = new Liang(zhu);

		// 小梁GG邀请小祝MM晚上吃饭
		liang.invite("晚上有时间吗?我请你吃饭");
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值