日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java线程读取流的时候卡死,java – 线程中断没有结束阻塞调用输入流读取

發布時間:2024/9/27 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java线程读取流的时候卡死,java – 线程中断没有结束阻塞调用输入流读取 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我正在使用RXTX從串口讀取數據.讀取是在以下列方式生成的線程內完成的:

CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(port);

CommPort comm = portIdentifier.open("Whatever", 2000);

SerialPort serial = (SerialPort)comm;

...settings

Thread t = new Thread(new SerialReader(serial.getInputStream()));

t.start();

SerialReader類實現Runnable并且只是無限循環,從端口讀取并將數據構建到有用的包中,然后再將其發送到其他應用程序.但是,我把它簡化為以下簡單:

public void run() {

ReadableByteChannel byteChan = Channels.newChannel(in); //in = InputStream passed to SerialReader

ByteBuffer buffer = ByteBuffer.allocate(100);

while (true) {

try {

byteChan.read(buffer);

} catch (Exception e) {

System.out.println(e);

}

}

}

當用戶單擊停止按鈕時,將觸發以下功能,理論上應關閉輸入流并中斷阻塞byteChan.read(緩沖)調用.代碼如下:

public void stop() {

t.interrupt();

serial.close();

}

但是,當我運行此代碼時,我從未得到ClosedByInterruptException,一旦輸入流關閉,它應該觸發.此外,執行阻止調用serial.close() – 因為底層輸入流仍然在讀取調用上阻塞.我已經嘗試用byteChan.close()替換中斷調用,然后應該導致AsynchronousCloseException,但是,我得到了相同的結果.

對我所缺少的任何幫助將不勝感激.

解決方法:

您不能簡單地通過包裝它來將不支持可中斷I / O的流創建到InterruptibleChannel中(并且,無論如何,ReadableByteChannel不會擴展InterruptibleChannel).

您必須查看基礎InputStream的合約. SerialPort.getInputStream()對其結果的可中斷性有何評價?如果它沒有說什么,你應該假設它忽略了中斷.

對于任何未明確支持可中斷性的I / O,唯一的選擇通常是從另一個線程關閉流.這可能會立即引發在調用流時阻塞的線程中的IOException(盡管它可能不是AsynchronousCloseException).

但是,即使這非常依賴于InputStream的實現 – 底層操作系統也是一個因素.

請注意newChannel()返回的ReadableByteChannelImpl類的源代碼注釋:

private static class ReadableByteChannelImpl

extends AbstractInterruptibleChannel // Not really interruptible

implements ReadableByteChannel

{

InputStream in;

?

標簽:java,multithreading,channel,nonblocking,rxtx

來源: https://codeday.me/bug/20191006/1861802.html

總結

以上是生活随笔為你收集整理的java线程读取流的时候卡死,java – 线程中断没有结束阻塞调用输入流读取的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。