2011-10-26 28 views
5

指定した時間だけメソッドを実行したい。指定された時間間隔でメソッドを実行する

public Response run(Request req){ 
    //method runImpl must run during specified interval of time(for example for 10 secs) 
    Response res = runImpl(req); 
    return response; 
    } 

これを行うにはどうすればよいですか?ありがとうございます!

+1

を? http://thedailywtf.com/Articles/The-Speedup-Loop.aspx –

+1

「指定された間隔で実行する」とはどういう意味ですか?その間隔内に完了すべきか?その間隔の後に戻る?その時間間隔の間に連続して呼び出されますか? –

+3

ここで「中」という言葉を使うのは非常に混乱します。 –

答えて

2

runImplは、このコードが機能するにはブール値を返す必要があります。プログラムが終了するまで待たされたくない場合は、新しいスレッド(基本的なチュートリアルがたくさんあります)にこれを置いておきましょう。

public Response run(Request req){ 
long lasttime=Sys.getTime(); 
int i=0; 
while(i<10){ 
    if(Response res = runImpl(req);){ 
    return response; 
    } 
    if((Sys.getTime-lasttime)>1000){ 
    i++; 
    lasttime=Sys.getTime(); 
    } 
} 
return null; 

あなたはそれが10秒、使用のために実行しているだけでなく、間隔で実行したい場合、これは、すべてのプロセッサモーメントを実行します:

public Response run(Request req){ 
long lasttime=Sys.getTime(); 
int i=0; 
for(int i; i<(10000/yourchoiceinterval); i++){ 
    if(Response res = runImpl(req);){ 
    return response; 
    } 
    if((Sys.getTime-lasttime)>1000){ 
    lasttime=Sys.getTime(); 
    } 
} 
return null; 
スピードアップループの実装
1

最適な方法は、適切なサイズのチャンクで作業することです。つまり、各チャンクは、たとえば1秒で実行できます。この方法で各チャンクの終わりに時間が経過したかどうかを確認できます。

作業が無期限にブロックできるI/O作業が含まれている場合は、割り込み可能なメソッド(Thread.interrupt()への呼び出しによって中断される可能性があります)または呼び出し元から明示的な最大実行時間を受け取るメソッドを使用してください。
または、I/O作業を専用のスレッドに委任し、別のスレッドで進捗状況をチェックし、実行時間を超過したときに適切に処理できます。

+0

チャンク実行中に「ハングする」機能がある場合はどうすればよいですか? – Martin

+0

@マーティン私は、妥当な確率で "ハングアップ"できるステップがないと仮定しました。ネットワークI/Oなどの手順がある場合は、I/Oなどのスレッドを使用してI/Oの進行状況を確認し、必要に応じてすぐにI/Oを中止します。 –

3

はこれを使用してみてください:

poolExecutor = new ScheduledThreadPoolExecutor(1); 
poolExecutor.scheduleAtFixedRate(
     new YourRunable(), startFrom/*10*/, startEvery/*5*/, TimeUnit.SECONDS); 
+0

ええ、これです。それは私が意味するものです! – SHiRKiT

+0

これは、実行可能ファイルが最大X秒間実行されることを強制しません。実行可能ファイルをN秒間に開始し、M秒ごとに再起動することを意図しています –

0

あなたは、あなたのメソッドを呼び出し、新しいスレッドを起動し、作成したタイマーが満了した後にスリープ状態にそれを置くことができます。そうすることで、メソッドサイクルが中断する前に完了したことを保証することはできませんが、メソッドを変更する必要はありません。あなたがサイクルを達成するためには、このスリープ状態のロジックをスレッドのループの中に入れてください。スレッドを起こすことを覚えておいてください。

十分に説明していないので、数多くの実装があるかもしれません。

関連する問題