如何以编程方式停止无限循环?

时间:2015-03-25 13:50:48

标签: java

这里我们将java程序作为另一个java程序的输入。如果给定的程序包含任何无限循环,那么我想杀死输入程序的特定进程。

public String javaProgram(String strFilePath, String filename) throws Exception {
        String path = strFilePath;
        String fname = filename;
        String output = "";
        String totalPath = "javac" + " " + strFilePath + "/" + fname + ".java";
        System.out.println("Total path" + totalPath);
        String s = null;
        String log = "";
        String errorfile = strFilePath + "/" + fname + "_Error.txt";
        try {
            FileOutputStream fos = new FileOutputStream(errorfile, true);
            Process pro = Runtime.getRuntime().exec(totalPath);
            BufferedReader stdError = new BufferedReader(new InputStreamReader(pro.getErrorStream()));
            boolean error = false;
            log += "\n....\n";
            while ((s = stdError.readLine()) != null) {
                error = true;
                fos.write(s.getBytes());
                return "errortrue";

            }
            fos.close();
            if (error == false) {
                output = runProcess(path, fname);
                return output;
            }
            if (output.equals("success")) {
                return "sucess";

            } else {
                return "false";
            }

        } catch (Exception e) {
            return "error";
        }
    }

    private static String runProcess(String command, String filename) throws Exception {
        String path1 = "java" + " " + "-cp" + " " + command + "/" + " " + filename;
        System.out.println("Path" + path1);
        String filepath = command + "/" + filename + "_output.txt";
        System.out.println("filepath=============" + filepath);

        System.out.println("Entered");

        Process pro = Runtime.getRuntime().exec(path1);

        String s = printLines(filepath, pro.getInputStream());
        return s;
    }

    private static String printLines(String name, InputStream ins) throws Exception {
        String line = null;
        int count=0;
        String strFilePath = name;
        System.out.println("NAME" + name);
        FileOutputStream fos = new FileOutputStream(strFilePath, false);
        BufferedReader in = new BufferedReader(new InputStreamReader(ins));
        while ((line = in.readLine()) != null) {
            fos.write(line.getBytes());
            System.out.println(name + " " + line);
//            count++;
//            if(count>10){
//                break;
//            }
        }



        fos.close();

        return "success";
    }

2 个答案:

答案 0 :(得分:3)

计算机科学中一个众所周知的问题叫做暂停问题。这里涉及很多花哨的数学和有趣的讨论,但对你而言重要的部分是,已经证明,一般来说,一个程序是否会永远运行是不可能的。有些特定情况可以静态找到,例如while (true),但如果您的目标是拥有一个可以杀死无限运行程序的强大主管,那么您将遇到困难。

相反,我建议您采取实施超时的方法。为程序提供运行时间。如果它需要更多,杀死它。例如,如果您确定10分钟太长,则终止任何超过10分钟的程序。这应该更加实用。

答案 1 :(得分:0)

几乎在一个世纪以前就证明,一个给定的程序是否会停止(因此不包含无限循环)通常是不可判定的。

请参阅http://en.wikipedia.org/wiki/Halting_problem