Naf*_*Kay 5 java theory network-programming bandwidth-throttling
我想以编程方式限制Java中的上传或下载操作.我会假设我需要做的就是检查上传的速度和插入方式Thread.sleep(),如下所示:
while (file.hasMoreLines()) {
String line = file.readLine();
for (int i = 0; i < line.length(); i+=128) {
outputStream.writeBytes(line.substr(i, i+128).getBytes());
if (isHittingLimit())
Thread.sleep(500);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码会起作用吗?如果没有,有更好的方法吗?有没有一个描述这个理论的教程?
令牌桶算法是一种限制上载或下载带宽的方法.您应该阅读本文:它解释了此算法的用法.
// rate = 512 permits per second or 512 bytes per second in this case
final RateLimiter rateLimiter = RateLimiter.create(512.0);
while (file.hasMoreLines()) {
String line = file.readLine();
for (int i = 0; i < line.length(); i+=128) {
byte[] bytes = line.substr(i, i+128).getBytes();
rateLimiter.acquire(bytes.length);
outputStream.writeBytes(bytes);
}
}
Run Code Online (Sandbox Code Playgroud)
正如Guava文档中所解释的那样: 重要的是要注意,请求的许可数量永远不会影响请求本身的限制(对acquire(1)的调用和对acquire(1000)的调用将导致完全相同的限制,如果任何),但它会影响下一个请求的限制.即,如果一个昂贵的任务到达空闲的RateLimiter,它将立即被授予,但它是下一个将经历额外限制的请求,从而支付昂贵任务的成本.
| 归档时间: |
|
| 查看次数: |
5700 次 |
| 最近记录: |