从线程执行程序服务中的cmd.exe进程运行进程不会删除终止的进程

时间:2018-09-24 21:59:24

标签: java multithreading process terminate

我有一个程序可以创建很多信息,然后我将这些信息通过

放入线程中。
final static ExecutorService service = Executors.newFixedThreadPool(10);

并通过以下方式传递信息:

service.submit(new threadTry(str));

threadTry是接收信息的线程,将其传递到命令行参数中以生成命令,执行该命令,然后如果符合条件,则cmd进程将运行下一个进程。

然后,Executor服务获取已提交作业的列表,使用提供给他们的信息运行我将其限制为的10个线程,创建一个运行命令行窗口的进程,如果满足特定条件,该命令行窗口会弹出另一个窗口遇见。实际上,命令行窗口和弹出的其他窗口确实会终止,并且包含命令行窗口的线程也会终止。 ExecutorService用另一个信息启动另一个线程。但是,cmd.exe和其他程序在Windows 7资源监视器中已终止。我的程序生成这些终止的cmd / s的150-250之间(与此同时,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();
        }
    }
}

0 个答案:

没有答案