Запуск процесса из процесса cmd.exe внутри службы исполнения потоков не приводит к удалению завершенных процессов - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть программа, которая создает много информации, и я беру эту информацию и добавляю ее в поток с помощью

final static ExecutorService service = Executors.newFixedThreadPool(10);

и передаю информацию через:

service.submit(new threadTry(str));

Где threadTry - это поток, который получает информацию, передает ее в аргументы командной строки для генерации команды, выполняет команду, затем процесс cmd запускает следующий процесс, если критерии удовлетворены.

Затем служба Executor принимаетсписок отправленных заданий, запускает 10 потоков, которыми я его ограничил, с помощью предоставленной им информации, создает процесс, который запускает окно командной строки, которое может вызвать другое, если удовлетворены определенные критерии.Окно командной строки и всплывающее дополнительное окно фактически завершаются, и поток, содержащий окно командной строки, также завершается.ExecutorService запускает другой поток с другим битом информации.Тем не менее, cmd.exe и другие программы перечислены в мониторе ресурсов Windows 7 как прекращено.Моя программа генерирует между 150-250 из этих завершенных cmd's / second (Дескрипторы процесса javaw.exe идут вверх и вверх с этим).Только после того, как я принудительно остановил основную программу, все завершенные процессы освобождаются.

Моя главная проблема в том, что я должен передать столько информации, что моя программа выполнит примерно 56%, а затем остановится.Я предполагаю, что это потому, что операционная система не может отслеживать так много процессов (даже если они завершены, но все еще перечислены).Остановка не вызвана основной программой, она генерирует всю информацию и завершается в течение 2 секунд (ничего не делая с информацией).С обработкой информации моя программа занимает около 2-3 часов, чтобы добраться до 56%.

public class threadTry extends Thread {
    String str="";
    public threadTry(String str){
        this.str=str;
    }
    public void run(){
        try{
            String[] cmd={"...",str,"..."}; //input many arguments into cmd
            ProcessBuilder probuilder= new ProcessBuilder( cmd );
            Process process = probuilder.start();
            if(!process.waitFor(5, TimeUnit.SECONDS)){//if we wait longer than 5 seconds, 
              //then print this message (this is the standard wait for the process that 
              //waits until termination)
                System.out.println(str+": has exited with thread: "+this.getId());
            }
            int exitValue = process.exitValue();
            if(exitValue!=3){
                System.out.println("---------------------------------------------------");
                System.out.println("\n\nExit Value is " + exitValue+" For: "+str);
                System.out.println("---------------------------------------------------");
            }
            process.destroyForcibly();//does nothing to help clear the already 
              //terminated process
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
...