从管道读取的无限循环线程进入 timed_waiting

Posted

技术标签:

【中文标题】从管道读取的无限循环线程进入 timed_waiting【英文标题】:Infinite loop thread reading from pipe enters a timed_waiting 【发布时间】:2014-06-19 12:59:25 【问题描述】:

我需要一个在后台运行的线程从管道读取,但循环突然停止&当我显示线程状态时,我在 TIMED_WAITING 中找到它如何防止它出现这种行为,在线程内运行的代码下方,谢谢提前。

BufferedReader in = null;

while (started) 

  String xml = "";
  // char [] buf=new char[250];
  try 
    in = new BufferedReader(new FileReader(pipeName));
    while (!in.ready()) 
    

    // in.read(buf,0,buf.length);
    xml = in.readLine();
    // in.close();

   catch (Exception e) 
    System.out.println("error:" + e.getMessage());

    continue;
  

  if (xml != null && !xml.equals("")) 

    System.out.println("recieved: " + xml);
  

编辑: 使用@thomas 的链接后,程序在打印时运行良好,但是当我尝试解析 pr 在字符串上执行一些函数时,读取的数据变得不稳定且不完整

【问题讨论】:

摆脱这个:while(!in.ready()) @GregKopff 现在它会在更长的时间后停止 等待通知模式怎么样?所以你的代码中没有无限循环。 @Thomas 我正在尝试构建某种电路模拟器,它的 UI 是用 java 编写的,电路和微控制器模拟器都是用 C 语言构建的,所以当我开始模拟代码时,我需要用于从电路模拟器中连续读取值的 java UI;这就是为什么我需要无限循环,当然它会被停止 @AbdoSalem :嗯,好吧,确实有些不同。我假设 C 代码写入文件,并且您希望在 java 中实时更新文件。也许这是一个类似的问题:***.com/questions/14799945/… 【参考方案1】:

抱歉@thomas 耽搁了, 当我第一次问这个问题时,我有两个 C 程序和一个 java, 第一个 C 程序在管道中写入然后取消链接它,而另一个写入多次如果它取消链接管道 java 中的线程在一段时间后停止,但如果它没有取消链接我们收到的数据并根据打印良好@GregKopff 假设的编辑,但是当我将 xml 解析添加到第二个程序写入的数据中时,数据到达损坏和丢失,我认为 xml 解析需要太多时间,所以我更改了发送的数据格式,只需添加一个分隔符,我知道这不是一个解决方案,但它对我有用,再次抱歉延迟如果你想要一个版本,请询问,我希望它有帮助

【讨论】:

以上是关于从管道读取的无限循环线程进入 timed_waiting的主要内容,如果未能解决你的问题,请参考以下文章

从命名管道读取不会给出任何输出并无限期地阻塞代码

c++ 如何在构造函数中启动一个线程,从命名管道读取数据?

Java基础教程——线程状态

Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释

从文件读取数据时的无限循环

使用 cin::fail() 从标准输入进行无限循环读取