父进程不能退出

miaoyibosysu 2020-06-29 04:00:49
我在spring boot定时任务里去调用一个Python程序:
Process P1= Runtime.exec(...)


然后我在服务器上kill掉这个python程序后,java程序一直没有反应,看上去似乎没有退出,会是什么原因呢?
...全文
4340 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2020-07-01
  • 打赏
  • 举报
回复
打个断点试一下不就知道了么?debug一下
冰思雨 2020-06-30
  • 打赏
  • 举报
回复
你这个代码本身就存在问题啊。 proc的mputStream和ErrorStream的处理,应该与waitFor() 不在同一个线程里面调用才行。 waitFor是等待子进程处理完毕,两个Stream是读取子进程产生的数据。 一般编写代码是,一个Stream分配一个线程来处理产生的数据,主线程调用waitFor卡死,直到子进程退出并且两个Stream的数据处理完毕,主线程才会继续。
miaoyibosysu 2020-06-30
  • 打赏
  • 举报
回复
引用 1 楼 aw277866304 的回复:
最好贴一下主逻辑代码,这样看不出具体问题。 最有可能是JAVA代码未关闭进程。
public static int runPython(String[] param, String workName, Logger logger) {
		int exitCode = 1;
		try {
			Process proc = Runtime.getRuntime().exec(param);
			BufferedReader isReader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
			BufferedReader errorReader = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
			String isLine;
			String errorLine;			
			while ((errorLine = errorReader.readLine()) != null) {
				logger.error(workName + " error:" + errorLine);
			}
			while ((isLine = isReader.readLine()) != null) {
				logger.info(workName + " info:" + isLine);
			}
			isReader.close();
			errorReader.close();
			exitCode = proc.waitFor();
		} catch (IOException e) {
			logger.error(workName + "  error", e);
		} catch (InterruptedException e) {
			logger.error(workName + "  error", e);
		} finally {
			logger.info(workName + "  finish exitCode==" + exitCode);
		}
		return exitCode;
	}
miaoyibosysu 2020-06-30
  • 打赏
  • 举报
回复
引用 3 楼 冰思雨 的回复:
你这个代码本身就存在问题啊。 proc的mputStream和ErrorStream的处理,应该与waitFor() 不在同一个线程里面调用才行。 waitFor是等待子进程处理完毕,两个Stream是读取子进程产生的数据。 一般编写代码是,一个Stream分配一个线程来处理产生的数据,主线程调用waitFor卡死,直到子进程退出并且两个Stream的数据处理完毕,主线程才会继续。
如果子进程已经被主动杀掉了,java进程也会因为这种写法一直阻塞在这里吗?
CS_草祭先生 2020-06-29
  • 打赏
  • 举报
回复
最好贴一下主逻辑代码,这样看不出具体问题。 最有可能是JAVA代码未关闭进程。

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧