需要X时间的Java计算

时间:2015-07-12 10:27:50

标签: java android math

这只是一个假设的问题,但可以解决我遇到过的问题。

想象一下,您希望能够根据答案而不是计算所需的时间来计算计算功能。因此,不希望找出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。“

2 个答案:

答案 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数字例子一样。