资源描述:
《java 异步消息处理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Java异步消息处理一.它要能适应不同类型的请求:本节用makeString来说明要求有返回值的请求.用displayString来说明不需要返回值的请求.二.要能同时并发处理多个请求,并能按一定机制调度:本节将用一个队列来存放请求,所以只能按FIFO机制调度,你可以改用LinkedList,就可以简单实现一个优先级(优先级高的addFirst,低的addLast).三.有能力将调用的边界从线程扩展到机器间(RMI)四.分离过度耦合,如分离调用句柄(取货凭证)和真实数据的实现.分离调用和执行的过程,可以尽快地将调返回.现在看具体的实现:publicinter
2、faceAxman{ResultresultTest(intcount,charc);voidnoResultTest(Stringstr);}这个接口有两个方法要实现,就是有返回值的调用resultTest和不需要返回值的调用noResultTest,我们把这个接口用一个代理类来实现,目的是将方法调用转化为对象,这样就可以将多个请求(多个方法调)放到一个容器中缓存起来,然后统一处理,因为Java不支持方法指针,所以把方法调用转换为对象,然后在这个对象上统一执行它们的方法,不仅可以做到异步处理,而且可以将代表方法调用的请求对象序列化后通过网络传递到另一个机器
3、上执行(RMI).这也是Java回调机制最有力的实现.一个简单的例子.如果1:做A如果2:做B如果3:做C如果有1000个情况,你不至于用1000个case吧?以后再增加呢?所以如果C/C++程序员,会这样实现:(c和c++定义结构不同)typedefinestructMyStruct{intmark;(*fn)();}MyList;然后你可以声明这个结构数据:{1,A,2,B3,C}做一个循环:for(i=0;i4、来,然后去访问,调用,而Java中,我们无法将一个方法保存,除了直接调用,所以将要调用的方法用子类来实现,然后把这些子类实例保存起来,然后在这些子类的实现上调用方法:interfaceMy{voidtest();}classAimplementsMy{publicvoidtest(){System.out.println(“A”):}}classBimplementsMy{publicvoidtest(){System.out.println(“B”):}}classCimplementsMy{publicvoidtest(){System.out.prin
5、tln(“C”):}}classMyStruct{intmark;Mym;publicMyStruct(intmark,Mym){this.mark=amrk;this.m=m}}数组:{newMyStruct(1,newA()),newMyStruct(2,newB()),newMyStruct(3,newC())}for(xxxxxxxxx)if(参数==数组[i].mark)数组[i].m.test();这样把要调用的方法转换为对象的保程不仅仅是可以对要调用的方法进行调度,而且可以把对象序列化后在另一台机器上执行,这样就把调用边界从线程扩展到了机器.回
6、到我们的例子:classProxyimplementsAxman{privatefinalSchedulerscheduler;privatefinalServantservant;publicProxy(Schedulerscheduler,Servantservant){this.scheduler=scheduler;this.servant=servant;}publicResultresultTest(intcount,charc){FutureResultfutrue=newFutureResult();this.scheduler.invoke
7、(newResultRequest(servant,futrue,count,c));returnfutrue;}publicvoidnoResultTest(Stringstr){this.scheduler.invoke(newNoResultRequest(this.servant,str));}}其中scheduler是管理对调用的调度,servant是真正的对方法的执行:Servant就是去真实地实现方法:classServantimplementsAxman{publicResultresultTest(intcount,charc){char[
8、]buf=newchar[count];for(in