`
z7swf
  • 浏览: 183603 次
社区版块
存档分类
最新评论

Java模拟异步消息的发送与回调

    博客分类:
  • Java
阅读更多

 

 

本文的目的并不是介绍使用的什么技术,而是重点阐述其实现原理。

 

一、 异步和同步

讲通俗点,异步就是不需要等当前执行的动作完成,就可以继续执行后面的动作。

 

通常一个程序执行的顺序是:从上到下,依次执行。后面的动作必须等前面动作执行完成以后方可执行。这就是和异步相对的一个概念——同步。

 

案例:

A、张三打电话给李四,让李四帮忙写份材料。

B、李四接到电话的时候,手上有自己的工作要处理,但他答应张三,忙完手上的工作后马上帮张三写好材料,并传真给张三。

C、通完电话后,张三外出办事。

 

说明:

张三给李四通完电话后,就出去办事了,他并不需要等李四把材料写好才外出。那么张三让李四写材料的消息就属于异步消息。

相反,如果张三必须等李四把材料写好才能外出办事的话,那么这个消息就属于同步消息了。

 

二、 异步的实现

传统的程序执行代码都是从上到下,一条一条执行的。

但生活中有很多情况并不是这样,以上的案例中,如果李四需要几个小时以后才能帮张三写好材料的话,那张三就必须等几个小时,这样张三可能会崩溃或者抓狂。

 

这种一条龙似的处理,显示不太合理。

 

可以使用以下办法来处理这种问题:

张三找王五去给李四打电话,等李四写好材料后,由王五转交给张三。这样张三就可以外出办其他的事情了。

 

问题得到了合理的解决,之前张三一条线的工作,由张三和王五两条线来完成了,两边同时进行,彼此不耽误。

 

三、 计算机语言的实现

办法有了,如何用程序来模拟实现呢?

 

A、以前由一个线程来处理的工作,可以通过新增一个线程来达到异步的目的。这也就是JAVA中的多线程技术。

B、最后李四写好的材料必须交给张三,以做他用。这就是回调。

 

回调你可以这样来理解:

A发送消息给BB处理好A要求的事情后,将结果返回给AA再对B返回的结果来做进一步的处理。

 

四、 Java代码的实现

A、 回调的实现

 

/**
 * 回调接口
 * @author KOOK
 *
 */
public interface CallBack {
	/**
	 * 执行回调方法
	 * @param objects	将处理后的结果作为参数返回给回调方法
	 */
	public void execute(Object... objects );
}

 

Java是面向对象的语言,因此回调函数就变成了回调接口。

 

B、 消息的发送者

 

/**
 * 简单本地发送异步消息的类
 * @author KOOK
 *
 */
public class Local implements CallBack,Runnable{
	
	/**
	 * 远程接收消息的类,模拟point-to-point
	 */
	private Remote remote;
	
	/**
	 * 发送出去的消息
	 */
	private String message;
	
	public Local(Remote remote, String message) {
		super();
		this.remote = remote;
		this.message = message;
	}

	/**
	 * 发送消息
	 */
	public void sendMessage()
	{
		/**当前线程的名称**/
		System.out.println(Thread.currentThread().getName());
		/**创建一个新的线程发送消息**/
		Thread thread = new Thread(this);
		thread.start();
		/**当前线程继续执行**/
		System.out.println("Message has been sent by Local~!");
	}

	/**
	 * 发送消息后的回调函数
	 */
	public void execute(Object... objects ) {
		/**打印返回的消息**/
		System.out.println(objects[0]);
		/**打印发送消息的线程名称**/
		System.out.println(Thread.currentThread().getName());
		/**中断发送消息的线程**/
		Thread.interrupted();
	}
	
	public static void main(String[] args)
	{
		Local local = new Local(new Remote(),"Hello");
		
		local.sendMessage();
	}

	public void run() {
		remote.executeMessage(message, this);
		
	}
}

 

 

C、 远程消息的接收者

/**
 * 处理消息的远程类
 * @author KOOK
 *
 */
public class Remote {

	/**
	 * 处理消息
	 * @param msg	接收的消息
	 * @param callBack	回调函数处理类
	 */
	public void executeMessage(String msg,CallBack callBack)
	{
		/**模拟远程类正在处理其他事情,可能需要花费许多时间**/
		for(int i=0;i<1000000000;i++)
		{
			
		}
		/**处理完其他事情,现在来处理消息**/
		System.out.println(msg);
		System.out.println("I hava executed the message by Local");
		/**执行回调**/
		callBack.execute(new String[]{"Nice to meet you~!"});
	}
	
}

 

 

 

 

执行Local类的main方法。

 

注意Local类中红色背景的那行:

remote.executeMessage(message, this);

executeMessage方法需要接收一个message参数,表示发送出去的消息,而CallBack参数是他自己,也就是这里的this。表示发送消息后,由Local类自己来处理,调用自身的execute方法来处理消息结果。

如果这里不是用this,而是用其他的CallBack接口的实现类的话,那就不能称之为“回调”了,在OO的世界里,那就属于“委派”。也就是说,“回调”必须是消息的发送者来处理消息结果,否则不能称之为回调。这个概念必须明确。

 

 

 

11
1
分享到:
评论
1 楼 jelver 2008-10-25  
不错,通俗易懂
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Java调用微信支付接口

    使用了SSM框架,模拟调用 微信统一下单、查询订单、退款、查询退款 接口,模拟 微信回调

    Java调用机制步骤

    Java调用分为3种:同步调用,同步回调,异步回调  1.同步调用及平时常用的调用方式  2.回调在框架中使用较多,例如spring 的 AOP实现,servlet的拦截器实现  场景 老师布置完作业后提供一个回调方法,学生可以...

    java收银系统源码-reliable-message-samples:reliable-message示例

    异步调用RMQ确认发送消息。 3. 下层业务系统收到消息 --&gt; 执行业务操作(修改支付订单状态,修改账户余额)--&gt; 调用RMQ确认消费消息。 初始化示例代码数据库 下载项目源码并解压,执行 "数据库初始化SQL脚本...

    firebase-mock:用于编写单元测试的Firebase模拟库

    火基模拟 ... Firebase Mock允许您以指定的延迟( )同步或异步触发回调,而不是进行实际上是异步的服务器调用。 讲解 客户端( ) 认证方式 实时数据库 管理员( ) 认证方式 函数( ) 备择方案

    java8stream源码-devax-eventbridge-demo:2020年5月28日在EventBridge上的AWSDevAx会议

    从支付处理平台接收回调。 在 AWS 上,我们将使用将请求直接代理到 EventBridge。 本地合作伙伴集成 我们将在此处查看操作工作流,并展示您如何接收托管在 上的管道的构建通知。 我们将使用 Buildkite 与 ...

    Java学习笔记-个人整理的

    {7.2}回调模式与FileFilter}{104}{section.7.2} {7.3}\ttfamily RandomAccessFile}{106}{section.7.3} {7.4}基本类型数据序列化}{108}{section.7.4} {7.5}String的序列化}{109}{section.7.5} {7.6}InputStream...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--回调函数的定义 |--图片之BitMap、Drawable、inputStream及byte[] 互转 |--图片之保存图片至SD卡 |--图片之删除40%最近没有被使用的 |--图片之的本地缓存至SD卡 |--图片之网络异步下载图片 |--图片之获取SD卡所有...

    Spring.3.x企业应用开发实战(完整版).part2

    8.3.1 使用模板和回调机制 8.3.2 Spring为不同持久化技术所提供的模板类 8.4 数据源 8.4.1 配置一个数据源 8.4.2 获取JNDI数据源 8.4.3 Spring的数据源实现类 8.5 小结 第9章 Spring的事务管理 9.1 数据库事务基础...

    Spring3.x企业应用开发实战(完整版) part1

    8.3.1 使用模板和回调机制 8.3.2 Spring为不同持久化技术所提供的模板类 8.4 数据源 8.4.1 配置一个数据源 8.4.2 获取JNDI数据源 8.4.3 Spring的数据源实现类 8.5 小结 第9章 Spring的事务管理 9.1 数据库事务基础...

Global site tag (gtag.js) - Google Analytics