我有一个程序可以创建很多信息,然后我将这些信息通过
放入线程中。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();
}
}
}