ProcessBuilder进程未运行

时间:2014-04-09 05:43:49

标签: java multithreading process processbuilder

我对ProcessBuilder很新,并且使用线程。在它的当前状态下,我有一个J-Button,它启动一个预定的执行程序服务。计划的执行程序服务用于将进程委派给两个进程构建器之一。该应用程序旨在记录用户对话。在对话过程中,在x分钟后,它会创建一个wav并将其委托给可用的转录过程。当调用转录类时,问题就开始了。该过程已启动,应用程序按预期运行。但是,在我退出父应用程序之前,转录过程实际上并没有做任何事情。只有这样它才会开始。检查任务管理器它显示为一个进程,但使用0.0%的CPU和大约238MB的内存,直到我退出,然后两个进程跳转到30%-40%和500-1000 MB的内存。此外,我正在使用.waitFor(),但我使用一个线程来运行.waitFor()进程,因为我收集它会导致应用程序挂起。我该如何解决这个问题。对不起,我无法提供更多详细信息,但我是新手。提前谢谢!

public class TranDelegator {
    Future<?> futureTranOne = null;
    Future<?> futureTranTwo = null;
    ExecutorService transcriberOne = Executors.newFixedThreadPool(1);
    ExecutorService transcriberTwo = Executors.newFixedThreadPool(1);

    final Runnable transcribeChecker = new Runnable() {
        public void run() {
            String currentWav = null;
            File inputFile = new File("C:\\convoLists/unTranscribed.txt");

            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new FileReader(inputFile));
            } catch (FileNotFoundException e1) {
                System.out.println("reader didn't initialize");
                e1.printStackTrace();
            }
            try {
                currentWav = reader.readLine();
            } catch (IOException e) {
                System.out.println("currentWav string issue");
                e.printStackTrace();
            }
            try {
                reader.close();
            } catch (IOException e) {
                System.out.println("reader couldn't close");
                e.printStackTrace();
            }

            if(currentWav != null){
                if (futureTranOne == null || futureTranOne.isDone()) {
                    futureTranOne = transcriberOne.submit((transcriptorOne));
                }

                else if (futureTranTwo == null || futureTranTwo.isDone()) {                     
                    futureTranTwo = transcriberTwo.submit((transcriptorTwo));               
                }
            }
        }
    };

    final Runnable transcriptorOne = new Runnable() {
        public void run() {
            System.out.println("ONE");
            try {
                String classpath = System.getProperty("java.class.path");
                String path = "C:/Program Files/Java/jre7/bin/java.exe";
                ProcessBuilder processBuilder = new ProcessBuilder(path, "-cp",
                        classpath, Transcriber.class.getName());
                Process process = processBuilder.start();
                try {
                    process.waitFor();
                } catch (InterruptedException e) {
                    System.out.println("process.waitFor call failed");
                    e.printStackTrace();
                }
            } catch (IOException e) {
                System.out.println("Unable to call transcribeConvo");
                e.printStackTrace();
            }

        }
    };
    final Runnable transcriptorTwo = new Runnable() {
        public void run() {
            System.out.println("TWO");
            try {
                String classpath = System.getProperty("java.class.path");
                String path = "C:/Program Files/Java/jre7/bin/java.exe";
                ProcessBuilder processBuilder = new ProcessBuilder(path, "-cp",
                        classpath, Transcriber.class.getName());
                Process process = processBuilder.start();
                try {
                    process.waitFor();
                } catch (InterruptedException e) {
                    System.out.println("process.waitFor call failed");
                    e.printStackTrace();
                }
            } catch (IOException e) {
                System.out.println("Unable to call transcribeConvo");
                e.printStackTrace();
            }
        }
    };

}


public class Transcriber {
    public static void main(String[] args) throws IOException,
            UnsupportedAudioFileException {
        retreiveEmpInfo();
        TextoArray saveConvo = new TextoArray();
        ArrayList<String> entireConvo = new ArrayList();
        URL audioURL;
        String currentWav = wavFinder();
        ConfigReader configuration = new ConfigReader();
        ArrayList<String> serverInfo = configuration
                .readFromDoc("serverconfig");

        while (currentWav != null) {
            audioURL = new URL("file:///" + currentWav);
            URL configURL = Transcriber.class.getResource("config.xml");
            ConfigurationManager cm = new ConfigurationManager(configURL);
            Recognizer recognizer = (Recognizer) cm.lookup("recognizer");
            recognizer.allocate(); // allocate the resource necessary for the
                                    // recognizer
            System.out.println(configURL);

            // configure the audio input for the recognizer
            AudioFileDataSource dataSource = (AudioFileDataSource) cm
                    .lookup("audioFileDataSource");
            dataSource.setAudioFile(audioURL, null);

            // Loop until last utterance in the audio file has been decoded, in
            // which case the recognizer will return null.
            Result result;
            while ((result = recognizer.recognize()) != null) {

                String resultText = result.getBestResultNoFiller();
                // System.out.println(result.toString());
                Collections.addAll(entireConvo, resultText.split(" "));
            }
            new File(currentWav).delete();
            saveConvo.Indexbuilder(serverInfo, entireConvo);
            entireConvo.clear();
            currentWav = wavFinder();
        }
        System.exit(0);
    }

    private static String wavFinder() throws IOException {
        String currentWav = null;
        int x = 1;
        File inputFile = new File("C:\\convoLists/unTranscribed.txt");
        File tempFile = new File("C:\\convoLists/unTranscribedtemp.txt");

        BufferedReader reader = new BufferedReader(new FileReader(inputFile));
        BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
        String currentLine = null;
        String newLine = System.getProperty("line.separator");

        while ((currentLine = reader.readLine()) != null) {
            if (x == 1) {
                currentWav = currentLine;
            } else {
                writer.write(currentLine);
                writer.write(newLine);
            }
            x = 2;
        }
        reader.close();
        writer.flush();
        writer.close();
        inputFile.delete();
        // boolean successful =
        tempFile.renameTo(inputFile);
        // System.out.println("Success: " + successful);
        // System.out.println("currentWav = " + currentWav);
        return currentWav;
    }

    private static void retreiveEmpInfo() throws IOException {
        File tempFile = new File("C:\\convoLists/tmp.txt");

        BufferedReader reader = new BufferedReader(new FileReader(tempFile));
        CurrentEmployeeInfo.setName(reader.readLine());
        CurrentEmployeeInfo.setUserEmail(reader.readLine());
        CurrentEmployeeInfo.setManagerEmail(reader.readLine());
        reader.close();
    }
}

2 个答案:

答案 0 :(得分:0)

(来自评论)

看起来进程挂起是由于输出/错误流已满。你需要消耗这些流;可能通过一个帖子。

Java7提供了另一种重定向输出的方法。

相关:http://alvinalexander.com/java/java-exec-processbuilder-process-3

答案 1 :(得分:0)

  

此问题可能与子流程的输入流缓冲区有关。

您应该清除子流程的输入流缓冲区。

随着时间的流逝,这些流缓冲区在父进程的内存中增加,并且有时您的子进程将停止响应。

很少有可以使子流程正常工作的选项

  1. 连续读取子流程的输入流
  2. 重定向子流程的输入流
  3. 关闭子流程的输入流

关闭子流程的输入流

ProcessBuilder processBuilder = new ProcessBuilder(command);
Process process = processBuilder.start();
InputStream inStream = process.getInputStream();
InputStream errStream = process.getErrorStream();
try {
    inStream.close();
    errStream.close();
} catch (IOException e1) {
}
process.waitFor();

读取子流程的输入流

    ProcessBuilder processBuilder = new ProcessBuilder(command);
    Process process = processBuilder.start();
    InputStreamReader tempReader = new InputStreamReader(new BufferedInputStream(p.getInputStream()));
    final BufferedReader reader = new BufferedReader(tempReader);
    InputStreamReader tempErrReader = new InputStreamReader(new BufferedInputStream(p.getErrorStream()));
    final BufferedReader errReader = new BufferedReader(tempErrReader);

    try {
        while ((line = reader.readLine()) != null) {
        }
    } catch (IOException e) {
    }

    try {
        while ((line = errReader.readLine()) != null) {
        }
    } catch (IOException e) {
    }
    process.waitFor();

重定向子流程的输入流

ProcessBuilder processBuilder = new ProcessBuilder(command);
processBuilder.redirectInput();
processBuilder.redirectError();
Process process = processBuilder.start();
process.waitFor();