如何使用Java comm API处理读取超时

时间:2010-04-12 16:57:34

标签: java timeout

我的应用使用Java serial comm api。通过读取文档,如果没有可用的数据,inputstream.read()方法将阻塞。

我尝试在serialport对象上设置超时,但isReceiveTimeoutEnabled()方法返回false,表示我的驱动程序本身不支持超时。

那么,鉴于上述情况,实现读取超时的最佳方法是什么?

谢谢, 佛瑞德

4 个答案:

答案 0 :(得分:1)

如果它不起作用,只需将输入流投入线程并实现自己的时间。如果它超时调用流上的close()来解除阻塞并关闭该线程

答案 1 :(得分:1)

你需要两个线程。

监视程序线程将监视读取线程并在检测到超时时将其中断。

让读取线程告诉看门狗线程它将要开始读取,以及何时完成读取。

看门狗线程在读取开始时启动定时器,并在读取线程超时时中断读取线程或在读取完成时停止监听超时。

如果您不熟悉它,请阅读Java线程。很容易出现多线程错误。

答案 2 :(得分:1)

如果下一个read()会阻止,您可以使用InputStream.available()方法进行检查。

答案 3 :(得分:0)

您还可以使用SerialPortEventListener作为回调来获取新可用数据的通知,并且只有在有事情要做时才调用read。

final SerialPort serialPort = ...;
final InputStream in = serialPort.getInputStream();
serialPortal.notifyOnDataAvailable(true);
serialPort.addEventListener(new SerialPortEventListener() {
    public void serialEvent(SerialPortEvent event) {
        if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            // read from InputSteam
        }
    }
});