Java逐渐减少数量,直到目标达到一定时间

时间:2013-09-16 13:24:13

标签: java

我对如何实现某些时间的概念感到苦苦挣扎。

基本上,我需要编写一些代码,这些代码将有效地执行加速以向服务器发送请求。

为了进一步解释,我需要在15分钟的加速期间向服务器发出请求。 15分钟后,应该每秒3次请求。在加速期开始时,我们可以每隔3秒开始(比方说)1个请求。它如何达到每秒3个请求的速率并不重要,但它不应该达到这个速率直到15分钟。

我需要帮助的是将其作为计时器实现。我需要一个函数来返回发送下一个请求之前等待的时间。

所以我有一个这样的循环:

  • 发送请求
  • 等待x个时间(函数返回x)

这种情况一直持续到15分钟,因此函数总是返回0.3秒的值(每秒实现3个请求 - 假设请求需要0秒才能发送,但这没关系......)

提供的值是: - 总加速时间。 - 在加速时间结束时每秒请求数。 - 在加速时间开始时每秒的请求数。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:3)

由于您并不太关心费率加快的确切方式,您可以选择以下假设:

  1. 费率将随时间线性增加
  2. 只要我们不放慢速度,一些近似值和舍入率就可以了。
  3. 你从时间= 0开始,到时间= 15

    在时间= 0时,你的速度是(比方说)每3秒1。在时间= 15时,您的速率为每0.3333秒1 从0到15的总变化是(3 - 0.3333 =)2.77777

    除以15,得到0.1777777。这意味着:如果你的利率每秒下降0.177777,你可以从3开始到0.3333结束

    这显示在这样的线性图上:

    enter image description here

    因此,如果您有一个方法知道自开始(x)以来的多长时间(以秒为单位),您可以计算当前的费率。

    double computeRate(double secondsSinceStart)
    {
       return 3 * (-0.177777 *  Math.floor(secondsSinceStart));
    }
    

    该计算是您必须等待的秒数。

    使用类似的原理,您可以假设非线性曲线,或以其他方式调整它。

答案 1 :(得分:1)

/**
 * start is the moment the first request is sent (in ms)
 * end is the moment, in which the targetDelta should be reached (in ms)
 * targetDelta is the targeted period between two requests (0.3)
 * initDelta is the initial delta (1.0)
 */
private int getWaitingPeriod(long start, long end, double targetDelta, double initDelta) {
    double timePassed = (double) (System.currentTimeMillis() - start);
    double progress = timePassed / (double) (end - start);
    if(progress >= 1) return (int) (targetDelta * 1000);
    return (int) ((targetDelta - (targetDelta - initDelta) * progress) * 1000);
}

未经测试,但这是您要搜索的内容吗?

编辑:哎呀,忘记将秒转换为ms ..现在已经过测试,例如:

    long start = System.currentTimeMillis();
    while(System.currentTimeMillis() < start + 10000) { //testing with 10 seconds

        int wait = getWaitingPeriod(start, start + 10000, 1, 0.3);
        System.out.println("waiting " + wait + "ms");
        try {
            Thread.sleep(wait);
        } catch(InterruptedException ex) {}

    }

答案 2 :(得分:0)

您可以从创建一个处理发送请求的类开始,如果不是这样的话。像(这更像面向对象):

public class RequestSender {

double startTime;

    // ramp up time is in minutes
double rampUpTime;
boolean firstRequest;
int requestPerSecBeforeTime;
int requestPerSecAfterTime;

RequestSender(double rampUpTime, int requestPerSecBeforeTime, int requestPerSecAfterTime){
    this.rampUpTime = rampUpTime;
    this.requestPerSecAfterTime = requestPerSecAfterTime;
    this.requestPerSecBeforeTime = requestPerSecAfterTime;
    firstRequest=true;
}

public void sendRequest(){
    if (firstRequest){
        startTime = System.currentTimeMillis();
        firstRequest = false;
    }
    // do stuff to send requests
}

public double getWaitTime(){
    if ((System.currentTimeMillis() - startTime)/60000 > rampUpTime){
        return 1/requestPerSecAfterTime;
    }
    else {
        return 1/requestPerSecBeforeTime;
    }
}

}

然后您可以在代码中使用此对象:

 RequestSender rs = new RequestSender(15, 1, 3);
 rs.sendRequest();
 Thread.wait(rs.getWaitTime());