思路:
1.线程一以固定颗粒度的时间重置统计变量
2.线程二对统计变量按指定的策略进行累加,当达到限速值时,进行速度控制,等待统计变量重置后,重新累加
实现代码如下
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
//上传下载限速新思路
public class RateLimiting {
public static volatile AtomicInteger speed = new AtomicInteger(0);
public static volatile boolean running = true;
public static void main(String[] args){
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
//线程1,以某个固定频率重置speed变量
scheduledExecutorService.scheduleWithFixedDelay(()-> {
System.out.println("上传/下载的速度为:" + speed.get() + " Kbit/s");
speed.set(0);
}, 1L, 1L, TimeUnit.SECONDS);
//线程2,假设以10Kbit/s的速度限制上传/下载
scheduledExecutorService.execute(()->{
while (running){
speed.getAndIncrement();
while (speed.get()>=10){}//进行限速控制
}
});
}
}
运行结果:
上传/下载的速度为:10 Kbit/s
上传/下载的速度为:10 Kbit/s
上传/下载的速度为:10 Kbit/s
上传/下载的速度为:10 Kbit/s
上传/下载的速度为:10 Kbit/s
上传/下载的速度为:10 Kbit/s