在我正在制作的程序(Java)中,我需要检查并行端口中的特定引脚。每当该引脚从逻辑 0 变为 1(正沿时钟)时,我必须读取端口上的数据并保存。这大约每 10 毫秒发生一次,但可能会略有不同。
为此,我创建了一个带有 while 循环的单独线程,该循环不断检查端口,但这会使处理器发疯,我知道这是因为 while 循环。我的问题是,如何在不使用处理器密集型 while 循环的情况下不断扫描端口?该程序不能准确知道何时会发生引脚更改,只知道它大约每 10 毫秒发生一次。
在我正在制作的程序(Java)中,我需要检查并行端口中的特定引脚。每当该引脚从逻辑 0 变为 1(正沿时钟)时,我必须读取端口上的数据并保存。这大约每 10 毫秒发生一次,但可能会略有不同。
为此,我创建了一个带有 while 循环的单独线程,该循环不断检查端口,但这会使处理器发疯,我知道这是因为 while 循环。我的问题是,如何在不使用处理器密集型 while 循环的情况下不断扫描端口?该程序不能准确知道何时会发生引脚更改,只知道它大约每 10 毫秒发生一次。
Runnable
触发一个计划以固定速率执行给定的线程。您可以为此使用Timer#scheduleAtFixedRate()
或。ScheduledExecutorService#scheduleAtFixedRate()
最后一个是首选。
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new PortScanner(), 0, 10, TimeUnit.MILLISECONDS); // Run every 10 ms.
哪里PortScanner
可以像这样:
public class PortScanner implements Runnable {
@Override
public void run() {
// Scan port here.
}
}
不要忘记scheduler.shutdown()
在应用程序退出时调用,否则线程可能会挂起。
可能有更好的解决方案,但在最坏的情况下Thread.sleep
,while 循环的每次迭代可能只需要 1-2 毫秒。
当您的代码未作为操作系统的一部分运行时,捕获硬件中断真的很棘手。你可以做的是把 Thread.Sleep ( 5 )。这将休眠 10 毫秒,并让其他线程运行或保持 CPU 空闲和冷却。有 5 毫秒的延迟应该足以确保不会错过任何时钟滴答。
当您的时钟在 10 毫秒高和 10 毫秒低之间交替时,这将起作用。对于其他模式,您必须相应地调整参数。