1

在我正在制作的程序(Java)中,我需要检查并行端口中的特定引脚。每当该引脚从逻辑 0 变为 1(正沿时钟)时,我必须读取端口上的数据并保存。这大约每 10 毫秒发生一次,但可能会略有不同。

为此,我创建了一个带有 while 循环的单独线程,该循环不断检查端口,但这会使处理器发疯,我知道这是因为 while 循环。我的问题是,如何在不使用处理器密集型 while 循环的情况下不断扫描端口?该程序不能准确知道何时会发生引脚更改,只知道它大约每 10 毫秒发生一次。

4

3 回答 3

6

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()在应用程序退出时调用,否则线程可能会挂起。

于 2010-05-05T21:08:26.293 回答
3

可能有更好的解决方案,但在最坏的情况下Thread.sleep,while 循环的每次迭代可能只需要 1-2 毫秒。

于 2010-05-05T21:09:27.503 回答
1

当您的代码未作为操作系统的一部分运行时,捕获硬件中断真的很棘手。你可以做的是把 Thread.Sleep ( 5 )。这将休眠 10 毫秒,并让其他线程运行或保持 CPU 空闲和冷却。有 5 毫秒的延迟应该足以确保不会错过任何时钟滴答。

当您的时钟在 10 毫秒高和 10 毫秒低之间交替时,这将起作用。对于其他模式,您必须相应地调整参数。

于 2010-05-05T21:07:41.490 回答