Java中的后台进程

3

我一直在为Java 7的OCP考试做准备。我正在阅读的书中,遇到了一些我不完全理解的内容。

那就是,

如果JVM是由IDE间接调用的,或者如果JVM是从后台进程调用的,则方法调用System.console()将失败并返回null。

什么情况下以及如何从后台进程调用JVM?有人能详细说明一下吗? 最好的问候

4个回答

3

假设您正在使用UNIX系统,并运行可以请求两个操作数并生成它们的总和的程序。如果您将其视为:

/home/ucas> java -jar add.jar
Please enter the first summand:
42
Please enter the second summand:
17
The sum is 59.

现在假设你将其后台运行:
/home/ucas> java -jar add.jar &
java.lang.NullPointerException at Add.main(Add.java:17)
....

看一下Add.java文件,你会发现:

Console console = System.console(); // 16
Reader  reader  = console.reader(); // 17

该进程与终端分离,因此console将为null。堆栈跟踪被打印到标准错误输出流中,而它没有被重定向。

1
这是根据文档所述。

虚拟机是否具有控制台取决于底层平台以及启动虚拟机的方式。如果从交互式命令行启动虚拟机而没有重定向标准输入和输出流,则其控制台将存在,并且通常连接到启动虚拟机的键盘和显示器。如果虚拟机是自动启动的,例如由后台作业调度程序启动,则通常不会有控制台。

像Eclipse这样的IDE将您的应用程序作为后台进程运行,而不是作为具有系统控制台的顶级进程。


1

这只是在说,如果您从IDE启动JVM或作为主Java进程的子进程,则它将不会连接到控制台。

  • 在IDE的情况下,使用IDE的控制台。
  • 在子进程的情况下,如果您想让子进程使用主进程的控制台,您需要重定向输入/输出流到主进程。

0

如果您从另一个进程调用JVM,则无法访问控制台。例如,您可以使用Runtime.exec(...)在另一个Java程序中运行Java程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接