深入浅出Java回调机制

时间:2021-10-10 16:13:35

本文转载自http://hellosure.iteye.com/blog/1130176

在网上看到了一个比喻,觉得很形象,这里借用一下:
你有一个复杂的问题解决不了,打电话给你的同学,你的同学说可以解决这个问题,但是需要一些时间,那么你不可能一直拿着电话在那里等,你会把你的电话号码告诉他,让他解决之后打电话通知你。回调就是体现在你的同学又反过来拨打你的号码。
结合到前面所分析的,你打电话给你同学就是【you call me】,你同学解决完之后打电话给你就是【i call you back】。

下面再给出一个关于利用回调配合异步调用的很不错的例子,来源于http://kt8668.iteye.com/blog/205739 回调接口:

  1. public interface CallBack {
  2. /**
  3. * 执行回调方法
  4. * @param objects   将处理后的结果作为参数返回给回调方法
  5. */
  6. public void execute(Object... objects );
  7. }

消息的发送者:

  1. /**
  2. * 这个类相当于你自己
  3. */
  4. public class Local implements CallBack,Runnable{
  5. private Remote remote;
  6. /**
  7. * 发送出去的消息
  8. */
  9. private String message;
  10. public Local(Remote remote, String message) {
  11. super();
  12. this.remote = remote;
  13. this.message = message;
  14. }
  15. /**
  16. * 发送消息
  17. */
  18. public void sendMessage()
  19. {
  20. /**当前线程的名称**/
  21. System.out.println(Thread.currentThread().getName());
  22. /**创建一个新的线程发送消息**/
  23. Thread thread = new Thread(this);
  24. thread.start();
  25. /**当前线程继续执行**/
  26. System.out.println("Message has been sent by Local~!");
  27. }
  28. /**
  29. * 发送消息后的回调函数
  30. */
  31. public void execute(Object... objects ) {
  32. /**打印返回的消息**/
  33. System.out.println(objects[0]);
  34. /**打印发送消息的线程名称**/
  35. System.out.println(Thread.currentThread().getName());
  36. /**中断发送消息的线程**/
  37. Thread.interrupted();
  38. }
  39. public static void main(String[] args)
  40. {
  41. Local local = new Local(new Remote(),"Hello");
  42. local.sendMessage();
  43. }
  44. public void run() {
  45. remote.executeMessage(message, this);  //这相当于给同学打电话,打完电话之后,这个线程就可以去做其他事情了,只不过等到你的同学打回电话给你的时候你要做出响应
  46. }
  47. }

消息的接收者:

  1. /**
  2. * 这个类相当于你的同学
  3. */
  4. public class Remote {
  5. /**
  6. * 处理消息
  7. * @param msg   接收的消息
  8. * @param callBack  回调函数处理类
  9. */
  10. public void executeMessage(String msg,CallBack callBack)
  11. {
  12. /**模拟远程类正在处理其他事情,可能需要花费许多时间**/
  13. for(int i=0;i<1000000000;i++)
  14. {
  15. }
  16. /**处理完其他事情,现在来处理消息**/
  17. System.out.println(msg);
  18. System.out.println("I hava executed the message by Local");
  19. /**执行回调**/
  20. callBack.execute(new String[]{"Nice to meet you~!"});  //这相当于同学执行完之后打电话给你
  21. }
  22. }

由上面这个例子可见,回调可以作为异步调用的基础来实现异步调用。