java-定时执行代码块

时间:2011-01-10 16:58:03

标签: java

喜 我想要一段代码(函数的某些行),它将运行一段规定的时间(比如x毫秒)。我可以在java中这样做吗?

5 个答案:

答案 0 :(得分:3)

第一种方法:

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

第二种方法

在线程中启动代码。

只要你需要睡觉主线程。

杀死(停止,打断)你的线程。

答案 1 :(得分:2)

使用基于当前时间戳的退出条件,或者创建一个单独的线程并在指定的超时后将其终止。

答案 2 :(得分:1)

在单独的线程中运行您的方法,但将其传递给Executor。然后,您可以使用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
}

答案 3 :(得分:0)

您可以使用日历:

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

答案 4 :(得分:0)

使用System.currentTimeMillis()检查时间,并在时间过后退出循环。

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

如果您因某种原因需要在线程内睡觉,请将您的睡眠时间调整为在结束时间结束。

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

如果您要使用wait()notify()方法,请使用计算出的timeLeft作为wait()的参数,以确保最长等待时间。一旦等待时间到来,该方法将返回并且循环将中断。

  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();
}