喜 我想要一段代码(函数的某些行),它将运行一段规定的时间(比如x毫秒)。我可以在java中这样做吗?
答案 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(); }