我想在Java中模拟一个高频率的时钟。例如,我们可以将其视为1 Mhz CPU时钟。这可以通过以下代码实现:
// 1000 nanoseconds between ticks.
final long period = 1000;
this.runnable = new Runnable() {
public void run() {
long last = System.nanoTime();
while (true) {
long now = System.nanoTime();
if (now - last > period) {
last = now;
System.out.println(Thread.currentThread().getId() + " ticked at:" + now);
}
}
}
};
this.thread = new Thread(this.runnable);
this.thread.start();
这段代码的问题在于,它是一个高CPU消耗者,因为线程一直在运行。我想让线程在随后的时间检查之间休眠一段时间,类似于下面的代码:
// 1000 nanoseconds between ticks.
final long period = 1000;
this.runnable = new Runnable() {
public void run() {
long last = System.nanoTime();
while (true) {
long now = System.nanoTime();
if (now - last > period) {
last = now;
System.out.println(Thread.currentThread().getId() + " ticked at:" + now);
}
}
// here 4 is arbitrary, it determines checks frequency
LockSupport.parkNanos(period / 4);
}
};
this.thread = new Thread(this.runnable);
this.thread.start();
这种方法的问题是线程暂停的时间太长(在Windows中〉1 ms)。如果我使用Thread.sleep(0, period / 4);
,也会发生同样的事情。我知道Thread.sleep
和LockSupport.parkNanos
只能保证最短的睡眠/停止时间。有没有办法达到我的目的,即:以这个频率勾选锁,而不使线程不断运行?
1条答案
按热度按时间jmo0nnb31#
ScheduledExecutorService
在现代Java中,我们很少需要直接寻址
Thread
。使用Java 5中添加的Executor框架。该框架的一部分是
ScheduledExecutorService
。您可以要求在指定的时间段之间重复执行任务。一些要点:
scheduleAtFixedRate
和scheduleWithFixedDelay
。我猜你想要第一个。但是你要研究这两个问题来决定你自己。下面是Java 20中的一些示例代码。
运行时:
计数= 13226
我们预计每毫秒大约有1,000个计数。在10毫秒内,我们预计会有大约10,000个。在Apple M1 MacBook Pro上运行Java 20中的IntelliJ时,我得到的计数结果为10,xxx到13,xxx。