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

プロキシされたオブジェクトへのメソッド呼び出しに時間制限を課すプロキシを生成する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 に答える
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 に答える
-1

Java タイマーを使用することも、Java で別の時間に使用することもできます (つまり、フォーム タイマー)。

詳細については、こちらを参照してください。

于 2013-04-28T17:10:29.120 に答える