在程序(Java)中,我需要检查并行端口中的特定引脚。每当该引脚从逻辑0变为1(正边沿时钟)时,我必须读取端口上的数据并保存它。这种情况大约每10毫秒发生一次,但可能会有所不同。
为了做到这一点,我用一个不断检查端口的while循环创建了一个单独的线程,但这使得处理器变得疯狂,我知道这是因为while循环。我的问题是,如何在不使用处理器密集的while循环的情况下不断扫描端口?该程序并不准确知道引脚何时发生变化,只是它发生在每10ms左右。
答案 0 :(得分:6)
触发计划以固定速率执行给定Runnable
的线程。您可以使用Timer#scheduleAtFixedRate()
或ScheduledExecutorService#scheduleAtFixedRate()
。最后一个是preferred。
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()
,否则线程可能会挂起。
答案 1 :(得分:3)
可能有一个更好的解决方案,但最糟糕的情况是,你可以在while循环的每次迭代中只用Thread.sleep
1-2ms。
答案 2 :(得分:1)
当代码未作为操作系统的一部分运行时,捕获硬件中断真的很棘手。你可以做的是把Thread.Sleep(5)。这将睡眠10毫秒,并将让其他线程运行或只是让CPU空闲和冷却。延迟5 ms应该足以确保不会错过任何时钟滴答。
当您的时钟在10 ms高和10 ms低之间交替时,这将起作用。对于其他模式,您必须相应地调整参数。