如何在Java中创建回调

时间:2014-10-04 17:26:10

标签: java callback

我是Java的新手。我正在尝试学习Java中的回调。我通过googling找到了很多结果。但是我需要一些简单的例子来解释在Java中使用回调实现。我希望它应该是类似计时器,每隔一分钟打印一些信息。

2 个答案:

答案 0 :(得分:1)

我正在打印您当前的日期和时间使用java.util.Date

import java.util.Date;               //importing this package just to use Date()

public class StackOverflowQ {

 public interface CallBackInt{
    String doJob(String str);
    }

public static void main(String[] args) {

    CallBackInt variable = new CallBackInt(){       //using the interface
        public String doJob(String str) {       //doJob method from interface
            return (str + new Date().toString()); 
                  //used .toString() as return type of doJob is String
        }
    };


    while (true) {                            //infinite loop

        System.out.println(variable.doJob("Current Date Instance is: "));
        try {
            Thread.sleep(60*1000);            
            //time is in miliseconds and 60*1000 mili sec=60 seconds = 1 minute
        }
        catch (InterruptedException e) {   
         //if there are any Exception thrown, this will catch it and help you !

            e.printStackTrace();
        }
    }

}
}

并且,线程是任何程序中的执行线程。 当前正在执行的任何进程都可以视为一个线程。 所以,在这个程序中 Thread.sleep 引用当前线程(当前是main()方法)。因此它暂停main()线程60秒并在暂停后重新开始,然后再次打印当前日期。

答案 1 :(得分:0)

面向对象,Java在老式意义上没有callbacks。相反,我们按照Observer pattern的方式执行某些操作,传递一个接口实例,该接口需要一个或多个名为某种方法的方法由另一个对象调用。在Java 8或更高版本中传递lambda将是另一种方法。

特别参见Executors tutorialScheduledExecutorService课程。

以下是直接从该类文档中获取的示例代码。

 import static java.util.concurrent.TimeUnit.*;
 class BeeperControl {
   private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

   public void beepForAnHour() {
     final Runnable beeper = new Runnable() {
       public void run() { System.out.println("beep"); }
     };
     final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
     scheduler.schedule(new Runnable() {
       public void run() { beeperHandle.cancel(true); }
     }, 60 * 60, SECONDS);
   }
 }