2010-04-12 37 views
1

我的應用程序使用Java串行通信API。從閱讀文檔中,如果沒有可用的數據,inputstream.read()方法會被阻塞。如何處理使用Java通信API讀取超時

我試着在serialport對象上設置超時,但isReceiveTimeoutEnabled()方法返回false,表明我的驅動程序本身不支持超時。

那麼實現上述讀取超時的最佳方式是什麼?

感謝, 弗雷德

回答

1

如果它不工作對你只是折騰那的InputStream成線,並實現自己的時間了。如果超時,請在流上調用close()以取消阻止並關閉該線程

1

您將需要兩個線程。

看門狗線程將監視讀取線程並在檢測到超時時將其中斷。

閱讀線程告訴看門狗線程它即將開始閱讀,以及何時完成閱讀。

看門狗線程在讀操作開始時啓動一個定時器,並在讀操作超時時中斷讀線程,或在讀操作完成時停止監聽超時。

如果您不熟悉Java線程,請閱讀它。多線程錯誤很容易。

0

您還可以使用SerialPortEventListener作爲回調來獲取新的可用數據的通知,並且只有在需要執行操作時才調用讀取。

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 
     } 
    } 
});