【发布时间】: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