【问题标题】:Why in this code ProcessBuilder execution affecting main thread? [closed]为什么在这段代码中 ProcessBuilder 执行会影响主线程? [关闭]
【发布时间】:2014-07-07 19:21:04
【问题描述】:

在这个程序中,在主线程 10 分钟后,开始时间和当前时间之间的差异增加到超过 1 秒,最多 8 秒。为什么会发生这种情况,进程构建器会影响主线程执行。

java 版本“1.6.0_26”

Java(TM) SE 运行时环境(内部版本 1.6.0_26-b03)

Java HotSpot(TM) 服务器虚拟机(内部版本 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));
                }

        }

}

【问题讨论】:

  • 每个进程都需要时间来启动和关闭。现实世界中没有什么是瞬时的;)

标签: java multithreading performance exec processbuilder


【解决方案1】:

因为这个process.waitFor();

查看 javadoc here

编辑 1:

再次查看代码后,您似乎并没有关闭您的流,因此非常快地消耗了大量资源(大量线程执行 IO)。

【讨论】:

  • process.waitFor() 在不同的线程(固定执行器池的线程)上调用,而不是在主线程上。
  • 您要关闭输入流吗?在我看来,有太多线程消耗资源非常快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多