有一个类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);
}
}
答案 0 :(得分: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;
}
答案 1 :(得分:0)
检查Guava library's 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;
}
答案 2 :(得分: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);
}
}
}
使用一个线程运行它一段时间后(你想要)在你的时间过后中断它很好,因为它提供了更多的命令及其并发性你也可以编辑上面的代码来根据你的要求改变它感谢< / p>
答案 3 :(得分: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);
}
}
}
答案 4 :(得分:-1)
您可以使用Java Timer,也可以使用java(即Form Timers)。
请参阅Here了解更多信息!