java异步跑代码 java实现异步的几种方法( 二 )


专利可以用来维护原创者的权益,但是专利的尺度宽泛以及漏洞极有可能通过了一些不实用的专利而引起很多不必要的麻烦 , 甚至对行业的发展造成阻碍.
如何用Java回调和线程实现异步调用软件模块之间的调用关系可以分为两大类:即同步调用和异步调用 。在同步调用中,一段代码(主调方)调用另一段代码(被调方),主调方必须等待这段代码执行完成返回结果后,才能继续往下执行,所以,同步调用是一种阻塞式调用,主调方代码一直阻塞等待直到被调方返回为止 。同步调用相对比较直观,也是大部分编程语言直接支持的一种调用方式 。但是 , 同步调用在处理比较耗时的情况下会严重影响程序性能,影响人机交互的瞬时反应 。例如,某个程序需要访问数据库获取大量数据,然后根据这些数据进行一系列处理,将处理结果显示在程序主窗口 。由于数据库访问和大量数据的处理都是耗时的工作,在这个工作完成之前,处理结果迟迟不能显示,用户点击鼠标也不会立即得到响应,让用户感到整个程序显得很沉重 。面对这样一些需要比较长时间才能完成的应用场景,我们需要采用一种非阻塞式调用方式,即异步调用方式 。在异步调用中 , 主调方调用被调方后,不等待对方返回结果就继续执行后续代码,被调方执行完毕后,通过某种手段通知调用方:结果已经出来,请酌情处理 。我们可以对上面的例子改用异步调用将问题轻松化解:把整个耗时的工作放进一个单独的线程,由主调方启动此线程后继续执行后续代码,线程在背后悄悄地处理费时的工作,当工作完成,采用回调的方式通知主调方工作完成,主调方将结果显示在主窗口 。经过这样的处理,主界面继续进行自己的工作而不必死等,就不会造成界面响应迟钝 。
在实现异步调用机制时 , 除了线程之外,还要用到回调 。回调是一种双向调用,也就是,被调方在被调用时也会调用主调方的代码 。在异步调用中,被调方需要在工作完成时通知主调方,即调用主调方的接口,这一机制通过回调实现 。回调和异步调用的关系非常紧密,回调是异步调用的基础[1] 。
本文理论联系实际 , 首先阐述如何使用Java实现回调机制 , 然后进一步阐述使用Java回调和线程实现异步调用,最后,阐述在异步调用中如何处理超时问题 。
1 Java回调机制的实现方法
实现Java回调,需要做如下三件事情:
(1)定义一个回调接口CallbackInterface
接口中声明回调方法handle,如图1所示,回调方法就是一个普通的方法,接收一个消息字符串或者一个封装了数据的事件 。
(2)定义一个类实现回调接口
这个类其实就是消息接收者和处理者 , 也就是调用方 , 回调方法是消息发生时实际处理消息的方法,此处简化为一条打印语句 。
(3)定义消息通知者
消息通知者也就是被调用方必须具备两种能力,第一,它必须知道谁是消息接收者,第二,当消息发生时,它能够回调这些接收者的回调方法 。为了获得这两种能力,消息通知者首先必须提供一个注册方法register, 通过注册的方式来注册多个对此消息或事件感兴趣的对象 。然后提供一个消息通知方法notifyMessage,在这个方法中调用所有消息接收者的回调方法 。具体代码如图3所示 。
比如用一个可变数组List用于保存消息接收者,注册的过程实际上是将消息接收者添加到这个数组,以备在需要通知消息的时候调用这些消息接收者的回调方法 。
使用Java回调和线程实现异步调用

推荐阅读