【问题标题】:java: Runtime.exec() Thread and errorOutput, readLinejava: Runtime.exec() 线程和errorOutput、readLine
【发布时间】:2011-09-04 12:13:48
【问题描述】:

虽然我不明白为什么会发生这种情况,但我遇到了非常常见的线程挂起情况。 我有 2 个线程:main() 和 errorStreamReaderThread

在主线程中:
- 通过 Runtime.exec()
执行外部进程 - 创建新的 errorStreamReaderThread 以消耗错误输出流
- 对外部进程的输入和输出流进行操作(执行命令并读取命令的输出)
- 向外部进程发送退出命令
- 为 errorStreamReaderThread
设置中断标志 - waitFor() 用于终止外部进程
- 返回外部进程的rc

在errorStreamReaderThread中:
- 在 !interruptedFlag &&(line=br.readLine())!=null 时对错误流执行缓冲 readLine(errorStream 是从 main 的外部进程传递的)
- 执行日志错误流


我希望即使 readLine() 在流上阻塞 - 一旦这个流的发起者完成(在这种情况下是外部进程)这个 readLine 应该被中断。

观察到的行为 - 95% 的时间一切正常 - 没有挂起,两个线程:主线程和错误线程都完成了,程序也完成了。 - 大约 5% 挂起 - 主线程完成(返回waitFor) - errorStreamReaderThread 在 BufferedReader.readLine 上被阻塞(实际上这个缓冲读取器的错误流不再存在,因为外部进程已完成)

额外的环境因素是这个java类作为oracle java函数执行(它被包裹在oracle中)

请让我知道我在这里缺少什么以及为什么我得到这个 readLine 挂在不存在的 errorStream 上

谢谢

【问题讨论】:

    标签: java readline runtime.exec


    【解决方案1】:

    事实上,这个缓冲读取器的错误流不再存在, 由于外部进程已完成

    你猜是因为你已经向外部进程发送了退出命令,还是你真的检查了这两种情况?

    由于一旦套接字关闭 BufferedReader.readLine() 将不再阻塞而是返回 null,我认为套接字没有关闭...

    【讨论】:

    • waitFor() 外部进程返回,我假设根据规范外部进程终止。规范说:“waitFor() 使当前线程在必要时等待,直到此 Process 对象表示的进程终止。如果子进程已经终止,则此方法立即返回。如果子进程尚未终止,则调用线程将被阻塞,直到子进程退出。”
    • 所以我同意你的观点,如果外部终止 - 应该关闭 errorStream - readLine 中不会挂起。如果我在这里看到挂在 readLine 中的错误。我怀疑它是由oracle wrapper(这个java代码是存储oracle java函数)或涉及一些错误引起的
    • “它被包裹在 oracle 中”和“这个 java 代码存储在 oracle java 函数中”到底是什么意思?
    • 这个类作为 oracle 函数发布,并从 oracle 函数调用中执行,例如:
      loadjava -user scott/tiger -oci8 aaa/plsquick/ demos/Hello.java 并创建函数 hello_there (to_whom IN VARCHAR2) RETURN VARCHAR2 AS LANGUAGE JAVA NAME 'aaa.plsquick.demos.Hello.publishedMethod (java.lang .String) 返回 java.lang.String'; /所以我试图了解errorThread的这种事后存在并对其进行锁定是否是由oracle执行环境引起的。
    猜你喜欢
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多