这只是一个假设的问题,但可以解决我遇到过的问题。
想象一下,您希望能够根据答案而不是计算所需的时间来计算计算功能。因此,不希望找出a + b是什么,而是希望继续执行一些计算,而时间< x秒。
看看这个伪代码:
public static void performCalculationsForTime(int seconds)
{
// Get start time
int millisStart = System.currentTimeMillis();
// Perform calculation to find the 1000th digit of PI
// Check if the given amount of seconds have passed since millisStart
// If number of seconds have not passed, redo the 1000th PI digit calculation
// At this point the time has passed, return the function.
}
现在我知道我是一个可怕的,卑鄙的人使用宝贵的CPU周期来简单地通过时间,但我想知道的是:
A)这可能吗?JVM会开始抱怨无响应吗?
B)如果可能,最好尝试执行哪些计算?
更新 - 回答:
基于答案和评论,答案似乎是“是的,这是可能的。但只有在Android主UI线程中不完成,因为用户的GUI将变得无响应并且将会5秒后抛出ANR。“
答案 0 :(得分:3)
A)这可能吗,JVM会开始抱怨无响应吗?
有可能,如果你在后台运行它,JVM和Dalvik都不会抱怨。
B)如果可能,最好尝试执行哪些计算?
如果目标是在x秒内运行任何计算,只需在总和上加1,直到达到所需的时间。在我的头顶,像:
public static void performCalculationsForTime(int seconds)
{
// Get start time
int secondsStart = System.currentTimeMillis()/1000;
int requiredEndTime = millisStart + seconds;
float sum = 0;
while(secondsStart != requiredEndTime) {
sum = sum + 0.1;
secondsStart = System.currentTimeMillis()/1000;
}
}
答案 1 :(得分:2)
如果您的代码不是某个实际跟踪线程执行时间的复杂系统的一部分,那么您和JVM不会抱怨。
long startTime = System.currentTimeMillis();
while(System.currentTimeMillis() - startTime < 100000) {
// do something
}
甚至是for
循环,每1000个循环只检查一次。
for (int i = 0; ;i++) {
if (i % 1000 == 0 && System.currentTimeMillis() - startTime < 100000)
break;
// do something
}
关于你的第二个问题,答案可能是计算一些值,这些值总是可以改进,就像你的PI数字例子一样。