什么是异步处理,官方说法:异步处理就是按照不同步的程序处理问题,与同步处理相对。这简直就是废话?我举个例子来说什么是异步处理。比如:
你是个倒霉蛋,被很多人借了钱,你向张三要他还钱,他说没钱要几天后还,然后几天后你依旧向张三要钱,如果他拖着不还,你就一直等着,如果庆幸他还了,你在继续向李四要钱。这就是
同步处理, 当你向张三要钱之后并向李四要钱这就是异步处理,你不用一直等张三给你钱后在向其他人要,这是异步处理的特点。以下我实现了一个简单异步处理的代码,分为WebClient客户端,Server服务器,AhCallback接口,客户端实现接口
选择什么时候用 异步处理,回调信息,服务段接受客户端信息并通过接口返回信息,
接口作用抽象出回调函数让客户端实现(有人要问了,为什么要这么做,不用这个可以吗?答案是可以,你也可以通过其他方式实现,不过那样不好,利用接口体现面对对象编程的思想,提高代码的鲁棒性,你要想成为大牛重在理解思想)。
public interface AhCallback {
/**
* @author JLH
* @since 2017/6/3
* AhCallback回掉接口
* ahCallback回掉函数
* */
public void ahCallback(String back);
}
//服务器类
public class Server {
public void serverView(WebCilent wc,String str){
System.out.println("服务端接受到 "+str);
//可加可不加,模拟网络延迟
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//回调,回调成功200表示
wc.ahCallback("200");
}
}
//客户端类
public class WebCilent implements AhCallback{
/**
* @author JLH
* @since 2017/6/3
* 模拟客户端
* */
private Server server;
public WebCilent(Server server){
this.server=server;
}
//实现简单异步调用
public void webCilent(final String str){
new Thread(){
public void run(){
server.serverView(WebCilent.this, str);
}
}.start();
}
@Override
public void ahCallback(String back) {
System.out.println("接收服务器传回数据 "+back);
}
}
//测试类
import org.junit.Test;
public class CallBackTest {
/* @Test
public void callback(){
Server server=new Server();
WebCilent wc=new WebCilent(server);
wc.webCilent("hello");
}*/
public static void main(String[] args) {
Server server=new Server();
WebCilent wc=new WebCilent(server);
wc.webCilent("hello");
}
}
- 这里发生意见有趣的事,就是单元测试Junit不支持多线程,它不会等你吧子线程里的东西运行完在结束的,如果要使用单元测试就要使用GroboUtils
了,感兴趣的话你可以google下。
**异步处理典型的一个代表
是AJAX的异步处理。一般用来显示登陆或者其它列表,目前这是我碰到的运用场景。**