除了@ DodgyCodeException有关输出刷新和连接的建议 +1 ,让我们运行此代码以确保您了解如何 RateLimiter 作品:
+1
RateLimiter
final double permitsPerSecond = 1; RateLimiter limiter = RateLimiter.create(permitsPerSecond); final Stopwatch stopwatch = Stopwatch.createStarted(); int i = 0; for (; i < 2 * permitsPerSecond; i++) { limiter.acquire(); } System.out.println("Elapsed = " + stopwatch.stop().elapsed(TimeUnit.MILLISECONDS) + "ms"); System.out.println("Number of records processed = " + i);
(请注意,我将尝试次数设置为两次 permitsPerSecond 数字。)当你设置 permitsPerSecond 至 1 , 你会看到的:
permitsPerSecond
1
经过= 1001ms 处理的记录数= 2
对于 permitsPerSecond = 10; 和 permitsPerSecond = 100; 它接近(在数学意义上)2s限制,因为第11或第101次尝试等待设置的限制 RateLimiter :
permitsPerSecond = 10;
permitsPerSecond = 100;
经过= 1902ms 处理的记录数= 20
和
经历= 1991ms 处理的记录数= 200
RateLimiter工作正常。问题是您的输出是缓冲的,因为您每次都不会刷新它。通常,标准输出是行缓冲的。所以,如果你写了
System.out.println("Number of records processed = " + (i+1));
你会看到100暂停。但是,你有什么:
System.out.print(“\ r \ n已处理的记录数=”+ i + 1);
有两个问题。首先,“\ r”不作为新行,不会引起冲洗;因此整个输出都被缓冲并一次性打印到控制台。其次,你需要把(i + 1)括在括号中。你将i追加到字符串,然后将1附加到结果字符串。