我有一个非常常见的线程挂起条件,虽然我不明白它为什么会发生。 我有2个线程:main()和errorStreamReaderThread
在主线程中:
- 通过Runtime.exec()执行外部进程
- 创建新的errorStreamReaderThread以消耗错误输出流
- 对外部进程的输入和输出流执行操作(执行命令和读取命令输出)
- 将退出命令发送到外部进程
- 为errorStreamReaderThread设置中断标志
- waitFor()外部进程终止
- 返回外部流程的rc
在errorStreamReaderThread中:
- 在错误流上执行缓冲的readLine而!interruptedFlag&&(line = br.readLine())!= null(errorStream从主进程从外部进程传递)
- 执行日志错误流
我希望即使readLine()阻塞了流 - 只要这个流的发起者完成(在这种情况下是外部进程),这个readLine应该被中断。
观察到的行为 - 95%的时间一切正常 - 没有挂起,两个线程:主线程和错误线程完成,程序完成。 - 它挂起约5% - 主线程完成(返回waitFor) - 在BufferedReader.readLine上阻止了errorStreamReaderThread(实际上,此缓冲读取器的错误流不再存在,因为外部进程已完成)
其他环境因素是这个java类作为oracle java函数执行(它包含在oracle中)
请让我知道我在这里缺少什么以及为什么我将这个readLine挂在不存在的errorStream上
谢谢
答案 0 :(得分:0)
实际上,此缓冲读取器的错误流不再存在, 因为外部过程已经完成
您是否认为是这种情况,因为您已将退出命令发送到外部进程,或者您是否真的检查了这两种情况?
由于BufferedReader.readLine()将不再阻塞,但一旦套接字关闭就返回null,我不认为套接字已关闭...