0

有一个类Algorithm有一个方法runAlgorithm。目前,它在停止之后执行一些预定义的迭代次数,例如 100 次迭代。这个方法是从类中调用的Test

现在我需要更新我的代码,以便能够在runAlgorithm必须停止之后运行该方法指定的分钟数,例如 5 分钟。

结果,我应该能够选择停止标准,即时间或迭代次数:algorithm.runAlgorithm('time',5)algorithm.runAlgorithm('iterations',100)

我不知道该怎么做。该类Algorithm应该实现为Runnable?还是我需要在课堂上创建一个计时器Test?指导将不胜感激。

public class Test {                                             

public static void main(String[] args) 
{

   init();

   Algorithm algorithm = new Algorithm();

   // 5 minutes is a stopping criterion for the algorithm
   Solution solution = algorithm.runAlgorithm('time',5);

   System.out.println(solution);

}

}
4

5 回答 5

2

从最初的声明100 次迭代中,我假设 runAlgorithm 基本上是一个循环。鉴于此,您只需像这样更改循环:

public Solution runAlgorithm( String method, int duration )
    Solution solution = null;
    if ( method.equals( "time" ) {
        long start = System.currentTimeMillis();
        while ( true ) {
            if ( System.currentTimeMillis() - start > duration ) {
                break;
            }
            // do stuff
        }
    }
    else {
        for ( int iter = 0; iter < 100; iter++ ) {
            // do stuff
        }
    }
    return solution;
}
于 2013-04-28T17:10:20.993 回答
0
while(!Thread.currentThread().isInterrupted()){
for(i=1;i<100;i++){
    if(i==1){
    //call your method
    //use sleep (optional)
    }

    if(i==2){
    //call your method
    //use sleep (optional)
    }
    .
     .
      .
    if(i==5){
    //call your method
    //use sleep (optional)
    }
    if(i==100){

        Thread.currentThread().interrupt();

        break;
    }
    try {
        Thread.sleep(600);
    } catch (InterruptedException ex) {
        Logger.getLogger(Thread2.class.getName()).log(Level.SEVERE, null, ex);
    }
}

}

于 2013-04-28T17:22:34.773 回答
0

检查Guava 库的 TimeLimiter,它生成代理,对代理对象的方法调用施加时间限制。

或者

你能试试这个吗?

private Solution runAlgorithm(String criterion, long minutes) {
   Solution solution = null;    
   if(criterion!=null && criterion.equalsIgnoreCase("time")){
        long startTime = System.currentTimeMillis();
        long endTime = startTime + minutes*60*1000;
        while (System.currentTimeMillis() < endTime)
        {
            // your code
        }
    }
    else {
            // run 100 iterations
     }
            return solution;
  }
于 2013-04-28T17:00:53.343 回答
0
    while(!Thread.currentThread().isInterrupted()){
    for(i=1;i<100;i++){

        if(i==100){

            Thread.currentThread().interrupt();

            break;
        }
        try {
            Thread.sleep(600);
        } catch (InterruptedException ex) {
            Logger.getLogger(Thread2.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

在您的时间过去后使用线程运行它一段时间(您想要)中断它很好,因为它提供了更多命令及其并发性,您可以编辑上面的代码以根据您的要求进行更改谢谢

于 2013-04-28T17:10:18.950 回答
-1

您可以使用 Java Timer,也可以在其他时间使用 Java(即 Form Timers)。

请参阅此处了解更多信息!

于 2013-04-28T17:10:29.120 回答