资源预览内容
第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
亲,该文档总共4页全部预览完了,如果喜欢就下载吧!
资源描述
本文的目的并不是介绍使用的什么技术,而是重点阐述其实现原理。一、 异步和同步讲通俗点,异步就是不需要等当前执行的动作完成,就可以继续执行后面的动作。通常一个程序执行的顺序是:从上到下,依次执行。后面的动作必须等前面动作执行完成以后方可执行。这就是和异步相对的一个概念同步。案例:A、张三打电话给李四,让李四帮忙写份材料。B、李四接到电话的时候,手上有自己的工作要处理,但他答应张三,忙完手上的工作后马上帮张三写好材料,并传真给张三。C、通完电话后,张三外出办事。说明:张三给李四通完电话后,就出去办事了,他并不需要等李四把材料写好才外出。那么张三让李四写材料的消息就属于异步消息。相反,如果张三必须等李四把材料写好才能外出办事的话,那么这个消息就属于同步消息了。二、 异步的实现传统的程序执行代码都是从上到下,一条一条执行的。但生活中有很多情况并不是这样,以上的案例中,如果李四需要几个小时以后才能帮张三写好材料的话,那张三就必须等几个小时,这样张三可能会崩溃或者抓狂。这种一条龙似的处理,显示不太合理。可以使用以下办法来处理这种问题:张三找王五去给李四打电话,等李四写好材料后,由王五转交给张三。这样张三就可以外出办其他的事情了。问题得到了合理的解决,之前张三一条线的工作,由张三和王五两条线来完成了,两边同时进行,彼此不耽误。三、 计算机语言的实现办法有了,如何用程序来模拟实现呢?A、以前由一个线程来处理的工作,可以通过新增一个线程来达到异步的目的。这也就是JAVA中的多线程技术。B、最后李四写好的材料必须交给张三,以做他用。这就是回调。回调你可以这样来理解:A发送消息给B,B处理好A要求的事情后,将结果返回给A,A再对B返回的结果来做进一步的处理。四、 Java代码的实现A、 回调的实现Java代码 1. /* 2. * 回调接口 3. * author KOOK 4. * 5. */ 6. public interface CallBack 7. /* 8. * 执行回调方法 9. * param objects 将处理后的结果作为参数返回给回调方法 10. */ 11. public void execute(Object. objects ); 12. /* * 回调接口 * author KOOK * */public interface CallBack /* * 执行回调方法 * param objects将处理后的结果作为参数返回给回调方法 */public void execute(Object. objects );Java是面向对象的语言,因此回调函数就变成了回调接口。B、 消息的发送者Java代码 1. /* 2. * 简单本地发送异步消息的类 3. * author KOOK 4. * 5. */ 6. public class Local implements CallBack,Runnable 7.8. /* 9. * 远程接收消息的类,模拟point-to-point 10. */ 11. private Remote remote; 12.13. /* 14. * 发送出去的消息 15. */ 16. private String message; 17.18. public Local(Remote remote, String message) 19. super(); 20. this.remote = remote; 21. this.message = message; 22. 23.24. /* 25. * 发送消息 26. */ 27. public void sendMessage() 28. 29. /*当前线程的名称*/ 30. System.out.println(Thread.currentThread().getName(); 31. /*创建一个新的线程发送消息*/ 32. Thread thread = new Thread(this); 33. thread.start(); 34. /*当前线程继续执行*/ 35. System.out.println(Message has been sent by Local!); 36. 37.38. /* 39. * 发送消息后的回调函数 40. */ 41. public void execute(Object. objects ) 42. /*打印返回的消息*/ 43. System.out.println(objects0); 44. /*打印发送消息的线程名称*/ 45. System.out.println(Thread.currentThread().getName(); 46. /*中断发送消息的线程*/ 47. Thread.interrupted(); 48. 49.50. public static void main(String args) 51. 52. Local local = new Local(new Remote(),Hello); 53.54. local.sendMessage(); 55. 56.57. public void run() 58. remote.executeMessage(message, this); 59.60. 61. /* * 简单本地发送异步消息的类 * 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(objects0);/*打印发送消息的线程名称*/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、 远程消息的接收者Java代码 1. /* 2. * 处理消息的远程类 3. * author KOOK 4. * 5. */ 6. public class Remote 7.8. /* 9. * 处理消息 10. * param msg 接收的消息 11. * param callBack 回调函数处理类 12. */ 13. public void executeMessage(String msg,CallBack callBack) 14. 15. /*模拟远程类正在处理其他事情,可能需要花费许多时间*/ 16. for(int i=0;i1000000000;i+) 17. 18.19. 20. /*处理完其他事情,现在来处理消息*/ 21. System.out.println(msg); 22. System.out.println(I hava executed the message by Local); 23. /*执行回调*/ 24. callBack.execute(new StringNice to meet you!); 25. 26.27. /* * 处理消息的远程类 * author KOOK * */public class Remote /* * 处理消息 * param msg接收的消息 * param callBack回调函数处理类 */public void executeMessage(String msg,CallBack callBack)/*模拟远程类正在处理其他事情,可能需要花费许多时间*/for(int i=0;i1000000000;i+)/*处理完其他事情,现在来处理消息*/System.out.println(msg);System.out.println(I hava executed the message by Local);/*执行回调*/callBack.execute(new StringNice to meet you!);执行Local类的main方法。注意Local类中红色背景的那行:remote.executeMessage(message, this);executeMessage方法需要接收一个message参数,表示发送出去的消息,而CallBack参数是他自己,也就是这里的this。表示发送消息后,由Local类自己来处理,调用自身的execute方法来处理消息结果。如果这里不是用this,而是用其他的CallBack接口的实现类的话,那就不能称之为“回调”了,在OO的世界里,那就属于“委派”。也就是说,“回调”必须是消息的发送者来处理消息结果,否则不能称之为回调。这个概念必须明
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号