如何使用java 8超时调用另一个函数内的泛型函数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用java 8超时调用另一个函数内的泛型函数?相关的知识,希望对你有一定的参考价值。

我有一个功能,给我一个服务状态:

public ServiceState getServiceState(){
      return someService().getState(); //currently state return "NOTACTIVE"
} 

当我在系统上调用某个方法时,服务应在x个时间量(未知时间)后处于活动状态:

someService().startService(); //after a while, the state of the service should be active

如果我想只检查一次服务状态,我会这样做:

public boolean checkCurrentState(String modeToCheck){
      return getServiceState() == modeToCheck; 
}

checkCurrentState("ACTIVE"); //return true or false depends on the state

问题是,状态需要一些时间来改变,所以我需要以下内容:

我需要检查当前状态(在我定义的x秒内的while循环中),如果在x秒之后服务仍然处于“NOTACTIVE”模式,我将抛出某种异常来终止我的程序。

所以我想到了以下解决方案:一个有两个变量的方法:一个表示可以在方法内部调用的泛型函数的变量,一个变量,它是我允许它继续检查的时间:(伪代码)

public void runGenericForXSeconds(Func function,int seconds) throws SOMEEXCEPTION{
      int timeout = currentTime + seconds; //milliseconds
      while (currentTime < timeout){
           if (function.invoke()) return; //if true exits the method, for the rest of the program, we are all good
      }
      throw new SOMEEXCEPTION("something failed"); //the function failed
}

有些东西,但我需要它尽可能通用(被调用的方法部分应采取其他方法),Java 8 lambdas是解决方案的一部分?

答案

具体使用您的示例:

public void runGenericForXSeconds(BooleanSupplier supplier, int seconds) throws SOMEEXCEPTION {
    int timeout = currentTime + seconds; // milliseconds
    while (currentTime < timeout) {
        if (supplier.getAsBoolean())
            return; // if true exits the method, for the rest of the program, we are all good
    }
    throw new SOMEEXCEPTION("something failed"); // the function failed
}

那么您的供应商只需要返回truefalse。例如。:

runGenericForXSeconds(() -> !checkCurrentState("ACTIVE"), 100);

请注意,您有一个繁忙的循环。除非您明确地想要这个,否则您可能希望在使用Thread.sleep()或类似的调用之间暂停。

以上是关于如何使用java 8超时调用另一个函数内的泛型函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何关联高阶函数之间定义的泛型类型?

C# 使用自定义的泛型函数/方法对泛型数组进行四则运算

具有高阶函数的泛型

swift4:使用func泛型类型来指定另一个func的泛型类型

如何调用具有泛型类型的结构的关联函数?

返回类型为协议的泛型函数与参数和返回类型为协议的非泛型函数的区别