我是一名刚开始学习基于Java的多线程编程的学生。
作为我的第一个练习,我被告知要创建一个执行Windows计算器的进程,然后等待该进程完成,然后发送一条消息。这是我所做的代码的一部分。
HTTP/1.1 301 Moved Permanently
当我执行它时,Windows 10计算器会打开,然后我收到“处理完成” 消息。我不知道为什么在进程仍在运行时收到消息,因为计算器已打开,所以我尝试运行完全相同的代码,但使用“ notepad.exe” 作为命令执行。
这次执行的结果是预期的:直到关闭记事本,我才收到消息。
我尝试打开其他 Windows 10 默认程序,如“ explorer.exe” ,其中一些以应有的方式工作,而另一些则没有。
我对它的工作方式的看法是“ explorer.exe” 或“ calc.exe” 就像某种启动器一样工作,因此当他们收到执行它们的流程时,他们会创建自己的流程,而Java程序无法控制这些流程。那是我做出的完全猜测。
实际问题是:为什么会这样? Windows 10计算器和其他程序在进程方面如何工作?
谢谢。
答案 0 :(得分:0)
Process#waitFor()
返回int
值,它实际上是该进程的退出代码(即errorlevel
)。
在启动的进程返回非零errorlevel
的情况下,您的代码会失败,否则会“正确”运行(即按预期)。您可以通过运行以下批处理文件进行检查:
@echo off
calc.exe
REM explorer.exe
echo Error level: %errorlevel%
它将在您的环境中为 calc.exe 和 explorer.exe 返回非零errorlevel
输出,为返回0
> notepad.exe 。
在我的环境( Windows 7 )上, calc.exe 也返回0
,并且您的代码段按预期工作。
还请考虑到某些程序在成功的情况下可能会返回非零退出代码-这不是严格的要求。
基于此,以及第一个练习不应太复杂的事实-假设您的代码段就是答案。
如果仍然需要找到解决方案,则可以这样做(在此批处理命令,而不是 Java ):
运行 calc.exe :
calc.exe
找到 calc.exe 过程的 PID :
tasklist /v /fo csv | findstr /i "calc.exe"
当不再显示流程时,例如,通过 PID 用break;
对流程进行无限检查。使用命令(假设PID = 1111
):
tasklist /fi "pid eq 1111"