小编w25*_*25r的帖子

当子进程仍处于打开状态时,为什么Java进程会从Gradle挂起?

如果在java中创建的进程创建了一个子进程,但随后返回,则JVM挂起,但没有进程ID.

下面的示例应用程序(需要Windows和Java 7)

import java.io.File;
import java.io.IOException;
import java.lang.ProcessBuilder.Redirect;
import java.nio.file.Files;

public class SubProcessHang {

    public static void main(String[] args) throws IOException, InterruptedException {
        ProcessBuilder builder = new ProcessBuilder("cmd", "/c", "start", "notepad.exe");
        File output = Files.createTempFile("output", "txt").toFile();
        builder.redirectError(Redirect.to(output));
        builder.redirectOutput(Redirect.to(output));
        Process process = builder.start();
        process.waitFor();
        int exitValue = process.exitValue();
        System.out.println("Process exit value:: " + exitValue);
        System.out.println("Output file length:: " + output.length());
        System.exit(exitValue);
    }
}
Run Code Online (Sandbox Code Playgroud)

当应用程序运行时,它会创建三个进程:java - > cmd - > notepad cmd立即返回,java调用System.exit(0),这会终止java进程.但是记事本仍然存在,并且,当从gradle(或eclipse)运行时,JVM会一直挂起,直到该进程消失,而不是返回它的返回值.

因此,子进程仍处于活动状态,但父进程已被部分杀死,但现在已永远搁浅.

用于重现此内容的build.gradle脚本

apply plugin: 'java'
apply plugin: 'application'
mainClassName …
Run Code Online (Sandbox Code Playgroud)

java jvm subprocess process gradle

14
推荐指数
1
解决办法
2839
查看次数

标签 统计

gradle ×1

java ×1

jvm ×1

process ×1

subprocess ×1