不经过while循环不断检查端口

时间:2010-05-05 21:00:27

标签: java loops port-scanning

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

为了做到这一点,我用一个不断检查端口的while循环创建了一个单独的线程,但这使得处理器变得疯狂,我知道这是因为while循环。我的问题是,如何在不使用处理器密集的while循环的情况下不断扫描端口?该程序并不准确知道引脚何时发生变化,只是它发生在每10ms左右。

3 个答案:

答案 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低之间交替时,这将起作用。对于其他模式,您必须相应地调整参数。