2011-01-10 6 views
3

こんにちは 私は、規定された時間(例えばxミリ秒)実行するコードブロック(関数の特定の行)が必要です。これは可能ですJava?java-timingコードブロックの実行

+2

何が渡された時の合意量の後に起こるだろうか?タイムアウト? –

答えて

2

第一のアプローチ:

long startTime = System.nanoTime(); 
while(System.nanoTime() - startTime < MAX_TIME_IN_NANOSECONDS){ 
    // your code ... 
} 

第二のアプローチ

スレッドでコードを起動し

あなたが必要とする限り、メインスレッドをスリープします。

スレッドを強制停止(中断)します。

2

現在のタイムスタンプに基づく終了条件を使用するか、別のスレッドを作成して、指定したタイムアウト後に強制終了します。

+1

+1。コード自体が現在の時刻を確認するために定期的に停止するか、別のスレッドが時刻を監視して何らかのkillシグナルを送信する必要があります。 –

+0

-1私たちはもうスレッドをkillしません。 –

+0

はい、ありがとうございます。どちらの方法でも、スレッドは最も確実に停止可能に設計できます。 –

0

あなたはカレンダーを使用することができます。

timeInMilis = Calendar.getInstance().getTimeInMillis(); 
while(Calendar.getInstance().getTimeInMilis() - timeInMilis < MAX_TIME_IN_MILIS){ 
    // Execute block 
} 
+0

ワウありがとう!!! –

0

System.currentTimeMillis()を使用して時刻を確認し、時間が経過した後にループを抜けます。

 
long endTime = System.currentTimeMillis() + ClassName.EXECUTION_TIME_MS; 
while (System.currentTimeMillis() < endTime) { 
    // do your stuff 
} 

あなたが、何らかの理由でスレッド内で眠る終了時に終了するあなたの睡眠時間を調整する必要がある場合。あなたはwait()notify()方法を使用するつもりなら

 
    long timeLeft = endTime - System.currentTimeMillis(); 
    if (sleepAmount > timeLeft) 
    sleepAmount = timeLeft; 
    Thread.sleep(sleepAmount); 

は、その後、最大待機時間を確保するためにwait()に引数として計算timeLeftを使用しています。待ち時間が訪れると、メソッドが戻り、ループが壊れます。

 
    long timeLeft = endTime - System.currentTimeMillis(); 
    if (timeLeft > 0) 
    this.wait(timeLeft); 

あなたは時間がかかることがありますループ内の複数のステップを実行している場合は、プロセスはステップ間で分割する場合は、あなたが指定した時間あればループを終了するには、手順の間に追加のチェックを追加する必要があります通過しました。これは設計上の決定です。タイマーが期限切れになったら、タスクが作業中のステップを完了して終了するようにしますか?望ましい結果に基づいてコーディングする方法は、あなた次第です。

 
long endTime = System.currentTimeMillis() + ClassName.EXECUTION_TIME_MS; 
while (System.currentTimeMillis() < endTime) { 
    this.doFirstLongThing(); 
    if (System.currentTimeMillis() >= endTime) break; 
    this.doSecondLongThing(); 
    if (System.currentTimeMillis() >= endTime) break; 
    this.doThirdLongThing(); 
} 
1

メソッドを別のスレッドで実行しますが、エグゼキュータに渡します。その後、Futureを使用して、スレッドが完了するまで一定の時間待機することができます。完了しないと、TimeoutExceptionが発生し、スレッドをキャンセルできます。スレッドをキャンセルすると、スレッドが中断されます。したがって、コードはスレッドの中断されたステータスを定期的にチェックし、必要に応じて終了する必要があります。例えば

ExecutorService exec = Executors.newSingleThreadExecutor(); 
Future<Integer> future = exec.submit(new Callable<Integer>(){ 
    @Override 
    public Integer call() throws Exception { 

     //do some stuff 

     //periodically check if this thread has been interrupted 
     if (Thread.currentThread().isInterrupted()) { 
      return -1; 
     }      

     //do some more stuff 

     //check if interrupted 
     if (Thread.currentThread().isInterrupted()) { 
      return -1; 
     } 

     //... and so on 

     return 0; 
    } 
}); 
exec.shutdown(); 

try { 
    //wait 5 seconds for the task to complete. 
    future.get(5000, TimeUnit.MILLISECONDS); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} catch (ExecutionException e) { 
    e.printStackTrace(); 
} catch (TimeoutException e) { 
    //the task did not complete in 5 seconds 
    e.printStackTrace(); 
    System.out.println("CANCELLING"); 

    //cancel it 
    future.cancel(true); //sends interrupt 
} 
関連する問題