2014-07-07 28 views
0

在这个程序中,10分钟后主启动时间和当前时间之间的差值增加到1秒以上,直到8秒。为什么会发生影响主线程执行的流程构建器。为什么在这段代码中ProcessBuilder执行影响主线程?

Java版本 “1.6.0_26”

的Java(TM)SE运行时环境(建立1.6.0_26-B03)

的HotSpot的Java(TM)服务器VM(建20.1-B02,混合模式

OS: Solaris 

import java.io.BufferedReader; 

import java.io.InputStreamReader; 

import java.util.ArrayList; 

import java.util.Date; 

import java.util.List; 

import java.util.concurrent.ExecutorService; 

import java.util.concurrent.Executors; 


public class ExecTest { 

     public ExecThread getExecThread(String cmd, int callNumberStart) { 
       return new ExecThread(cmd, callNumberStart); 
     } 

     public class ExecThread implements Runnable { 

       private String cmd; 
       private int callNumberStart; 

       public ExecThread(String cmd, int callNumberStart) { 
         this.cmd = cmd; 
         this.callNumberStart = callNumberStart; 
       } 

       public String executeCommand(String origLegCallId, String cmd) { 
         Process process = null; 
         String cmdOutput = null; 
         try { 
           List<String> command = new ArrayList<String>(); 
           String[] splittedCmd = cmd.split("\\s+"); 
           for(String tmp : splittedCmd){ 
             command.add(tmp); 
           } 
           ProcessBuilder builder = new ProcessBuilder(command); 
           process = builder.start(); 
           process.waitFor(); 
           InputStreamReader isr = new InputStreamReader(process.getInputStream()); 
           BufferedReader br = new BufferedReader(isr); 
           String line = null; 
           cmdOutput = new String(); 
           while ((line = br.readLine()) != null) { 
             cmdOutput = cmdOutput + line; 
           } 
         } catch (Exception ex) { 
           ex.printStackTrace(); 
           cmdOutput = null; 
         } 
         return cmdOutput; 
       } 


       @Override 
       public void run() { 
         while (true) { 
           System.out.println(callNumberStart + ":: " + Thread.currentThread().getName() + ":: Start " + 
new Date()); 
           String output=executeCommand("" + callNumberStart, cmd); 
           System.out.println(Thread.currentThread().getName()+"Output is:"+output); 
           System.out.println(callNumberStart + ":: " + Thread.currentThread().getName() + ":: End " + n 
ew Date()); 
           callNumberStart++; 
         } 

       } 

     } 

     public static void main (String args []) { 
       int numberOfThread =100; 
       String cmd = /home/run.sh; //{sleep 5;echo 'hello'} 
       ExecutorService es = Executors.newFixedThreadPool(numberOfThread); 

       ExecTest test=new ExecTest(); 

       for (int i = 1; i <= numberOfThread; i++) { 
         es.submit(test.getExecThread(cmd, i*10000)); 
       } 

       while (true) { 

         long startTime = System.currentTimeMillis(); 
         for (int j=0; j<5; j++) { 
           try { 
             Thread.sleep(200); 
           } catch (InterruptedException e) { 
             // TODO Auto-generated catch block 
             e.printStackTrace(); 
           } 
         } 
         System.out.println("Processing Time:: " + (System.currentTimeMillis()-startTime)); 
       } 

     } 

} 
+0

每个进程都需要时间来启动和关闭。在现实世界中什么都不是瞬间;) –

回答

1

因为这个process.waitFor();的。

查看javadoc here

编辑1:

具有代码第二次看后,似乎你不关闭你的流,因此消耗了大量的资源相当快的(大量的线程在做IO的)的。

+0

process.waitFor()在不同的线程(固定执行程序池的线程)上不在主线程上调用。 – amitbaxi777

+0

你正在关闭你的输入流?听起来有太多的线程消耗资源非常快。 – ra2085

相关问题