Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java comm API处理读取超时_Java_Timeout - Fatal编程技术网

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

如何使用Java comm API处理读取超时,java,timeout,Java,Timeout,我的应用程序使用Java串行通信api。从读取文档开始,如果没有可用数据,inputstream.read()方法将阻塞 我尝试在serialport对象上设置超时,但isReceiveTimeoutEnabled()方法返回false,表明我的驱动程序本机不支持超时 那么,在上述情况下,实现读取超时的最佳方法是什么 谢谢, Fred如果它对您不起作用,只需将inputstream放入一个线程并实现您自己的超时。如果在流上调用close()以取消阻塞并关闭该线程超时,则需要两个线程 看门狗线程将

我的应用程序使用Java串行通信api。从读取文档开始,如果没有可用数据,inputstream.read()方法将阻塞

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

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

谢谢,
Fred

如果它对您不起作用,只需将inputstream放入一个线程并实现您自己的超时。如果在流上调用close()以取消阻塞并关闭该线程超时,则需要两个线程

看门狗线程将监视读取线程,并在检测到超时时中断它

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

让看门狗线程在读取开始时启动计时器,并在读取线程超时时中断读取线程,或在读取完成时停止侦听一段时间


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

您可以使用该方法检查下一个
read()
是否会阻塞。

您还可以使用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
        }
    }
});