Java:子进程完成后使用相同的子进程变量是否安全?

标签 java process

当前一个子流程完成时,重用相同的变量来创建另一个子流程是否安全?

String cmd = nextCmd();
        while(waitForNext) {
            Process p = Runtime.getRuntime().exec(cmd);
            String iLine = null;
            String eLine = null;
            BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
            BufferedReader err = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            while((iLine = in.readLine())!=null 
                    || (eLine = err.readLine())!=null) {
                // just to clean the Streams
            }
            p.waitFor();
            cmd = nextCmd();
        }

如果循环持续一千次(例如),它是否有资格被GC?

最佳答案

Is it safe if I use the same variable to create another subprocess if previous subprocess finishes?

是的。如果子进程未完成,也是安全的,因为您将用新值(新对象引用)完全替换 p 中存储的值。

<小时/>

事实上,您所显示的循环中的分配根本不会覆盖以前的值。当新的迭代开始时,由于您已经在 block 内声明了变量,因此它要么是每次迭代中的新变量,要么被视为新变量(您可以以任何一种方式查看它,可能;字节码可能反射(reflect)了后者,但我认为理论反射(reflect)了前者)。 的赋值是为(新)变量提供一个初始值,而不是覆盖前一次迭代的值。如果您将 Process p 声明移到循环之外,那么您就会覆盖它。这仍然没问题。 :-)

该语言概念不一定翻译为字节码(这更实用),但作为一种语言概念确实如此。例如,您可以向 p 添加一个 final 修饰符,这样就可以了。下次p就不一样了。

关于Java:子进程完成后使用相同的子进程变量是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24968950/

相关文章:

java - Geronimo(或 Tomcat)集群中的启动逻辑

java - Java中根据PID杀死一个进程

c# - 如何找到正在运行的进程的窗口句柄?

c# - 在命令提示符下获取已经运行的 Windows 进程的控制台输出?将 StreamReader 定向到命令提示符

java - errorString() 方法的异常的优点/缺点

java - 谷歌图表和 Java

java - Groovy:为什么按空格拆分()空字符串会返回一个空字符串列表?

java - onKeyDown 方法崩溃应用程序

multithreading - Erlang 和进程

.net - 如何从 32 位进程启动 64 位进程