在代码中,变量timer将指定while循环结束的持续时间,例如60秒。
while(timer) {
//run
//terminate after 60 sec
}
long start = System.currentTimeMillis();
long end = start + 60*1000; // 60 seconds * 1000 ms/sec
while (System.currentTimeMillis() < end)
{
// run
}
你应该尝试一下新的Java Executor Services。 http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html
使用它,你就不需要自己编写循环来测量时间了。
public class Starter {
public static void main(final String[] args) {
final ExecutorService service = Executors.newSingleThreadExecutor();
try {
final Future<Object> f = service.submit(() -> {
// Do you long running calculation here
Thread.sleep(1337); // Simulate some delay
return "42";
});
System.out.println(f.get(1, TimeUnit.SECONDS));
} catch (final TimeoutException e) {
System.err.println("Calculation took to long");
} catch (final Exception e) {
throw new RuntimeException(e);
} finally {
service.shutdown();
}
}
}
Thread.sleep(1337);
吗? - MurmelThread t = new Thread(myRunnable); // myRunnable does your calculations
long startTime = System.currentTimeMillis();
long endTime = startTime + 60000L;
t.start(); // Kick off calculations
while (System.currentTimeMillis() < endTime) {
// Still within time theshold, wait a little longer
try {
Thread.sleep(500L); // Sleep 1/2 second
} catch (InterruptedException e) {
// Someone woke us up during sleep, that's OK
}
}
t.interrupt(); // Tell the thread to stop
t.join(); // Wait for the thread to cleanup and finish
这将使你的分辨率达到约半秒。通过在while循环中更频繁地轮询,您可以将其降低。
你的可运行代码应该像这样:
public void run() {
while (true) {
try {
// Long running work
calculateMassOfUniverse();
} catch (InterruptedException e) {
// We were signaled, clean things up
cleanupStuff();
break; // Leave the loop, thread will exit
}
}
根据Dmitri的回答更新
Dmitri指出了TimerTask,它可以让你避免循环。你只需做join调用,设置好的TimerTask会负责中断线程。这样可以获得更精确的分辨率,而无需在循环中轮询。
.interrupt()
的工作方式,除非线程被阻塞,否则它只会设置 interrupted
标志,线程仍然必须检查它以停止执行。此外,InterruptedException
是一个已检查的异常,你不能在任意代码中随意抛出它(你的示例将无法编译)。 - Dmitri取决于while循环正在执行的任务。如果存在长时间阻塞的可能,请使用TimerTask
调度任务来设置stopExecution
标志,并且.interrupt()
您的线程。
仅使用时间条件的循环可能会一直等待输入或锁定(但对您来说可能不是问题)。